2009-01-30 26 views
14

Ai đó có thể giải thích PVOID là gì và làm thế nào nó được sử dụng trong một chức năng như:Loại dữ liệu PVOID là gì?

BOOL DoSomething(PVOID pMemPhy) 
+0

Liên kết liên quan: [Loại dữ liệu Windows] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751 (v = vs.85) .aspx) – RAM

Trả lời

19

khoảng trống con trỏ, giống như

void *pMemPhy 

aka "Con trỏ trỏ tới một cái gì đó, nhưng đó là tùy thuộc vào bạn để hình nó ra ".

BOOL DoSomething (PVOID pMemPhy) 
{ 
    strcpy((char *)pMemPhy, "I love buffer overflows!"); 
    return TRUE; 
} 
1

Có vẻ như đó chỉ là bí danh (xác định hoặc typedef) cho void *. Tôi không có ý tưởng tại sao mọi người nghĩ rằng sẽ tốt hơn nhưng tôi biết một số API thích sử dụng trong trường hợp thực hiện một loại thay đổi trong tương lai.

Tôi biết rằng các phiên bản cũ của cửa sổ đã sử dụng những thứ như STDCALL làm tiền tố cho nhiều chức năng và định nghĩa STDCALL có thể thay đổi dựa trên phiên bản Windows bạn biên dịch. Đây là từ bộ nhớ (mà bị ảnh hưởng bởi rượu sau nhiều năm :-), do đó, không dựa vào điều này như phúc âm. Về cơ bản nó đúng nhưng các chi tiết có thể hơi khác một chút.

4
typedef void * PVOID; 

Nếu câu hỏi bạn đang sử dụng là con trỏ trống? Cách sử dụng phổ biến nhất là khi bạn truyền con trỏ tới bộ nhớ không thực sự quan tâm đến loại. miễn phí(), ví dụ.

Nếu thư viện xuất một hàm có thể lấy nhiều loại con trỏ, nhưng muốn hỗ trợ các ngôn ngữ như C không có quá tải hàm, thì void * hoạt động.

11

Đây là con trỏ trống - con trỏ đến địa chỉ bộ nhớ không có thông tin về loại giá trị trỏ đến. Vì lý do này, bạn phải đưa con trỏ đến một kiểu như (char *)pMemPhy hoặc (int *)pMemPhy trước khi sử dụng con trỏ để trình biên dịch biết bộ nhớ hoạt động bao nhiêu (1 byte cho một char, 4 byte cho một int, v.v.)

+0

@Jeremy Ruten, Trong trường hợp này, nếu nó là một địa chỉ bộ nhớ vật lý, tôi nên bỏ nó vào cái gì? –

+0

Không quan trọng địa chỉ bộ nhớ là gì (tôi không chắc chắn ý của bạn là "địa chỉ bộ nhớ vật lý"), chỉ cần đưa nó vào bất kỳ kiểu nào bạn muốn hàm của bạn xử lý nó. Nó phụ thuộc vào những gì hàm muốn thực hiện, nhưng tôi nghĩ rằng hầu hết thời gian bạn sẽ cast (char *). –

+0

Đây là một hàm API thực sự. Theo mô tả, chức năng này sẽ mở một cổng trên thẻ giao diện. Không có nhiều thông tin có sẵn vì vậy tôi không biết phải làm gì với thông số "PVOID pMemPhy". –

4

Như những người khác đã nói, nó tương đương với void *.

void con trỏ thường được sử dụng trong hoạt động bộ nhớ (memcpy, memset, v.v ...) vì không muốn giả định loại dữ liệu tại địa chỉ đã cho.

Con trỏ và con trỏ void được cung cấp phương pháp điều trị tốt trong this bài viết từ http://cplusplus.com.

4

Điều này và các bộ nhớ khác như BOOL, LPCTSTR có nguồn gốc với Windows, BTW được phát triển trước khi tồn tại tiêu chuẩn C và không phụ thuộc vào trình biên dịch cụ thể.

Bạn có thể kiểm tra blog Old New Thing để biết thêm các câu chuyện về lịch sử phát triển Windows và những điều kỳ lạ của nó sẽ vẫn còn với chúng tôi (http://blogs.msdn.com/oldnewthing).

+1

https://blogs.msdn.microsoft.com/oldnewthing/20080325-00/?p=23013/ – Eugene

Các vấn đề liên quan