2008-10-09 43 views
7

Tôi thường xuyên gặp phải một số định nghĩa cho cấu trúc Win32API (nhưng không giới hạn ở đó) có thành viên cbSize như trong ví dụ sau.Mục đích của thành viên cbSize trong cấu trúc Win32API

typedef struct _TEST { 
    int cbSize; 
    // other members follow 
} TEST, *PTEST; 

Và sau đó chúng ta sử dụng nó như thế này:

TEST t = { sizeof(TEST) }; 
... 

hoặc

TEST t; 
t.cbSize = sizeof(TEST); 
... 

đoán ban đầu của tôi là điều này có khả năng có thể được sử dụng cho versioning. Một DLL nhận một con trỏ cho một cấu trúc như thế này có thể kiểm tra xem thành viên cbSize có giá trị dự kiến ​​mà DLL đã được biên dịch hay không. Hoặc để kiểm tra xem việc đóng gói thích hợp có được thực hiện cho cấu trúc hay không. Nhưng tôi muốn ở đây từ bạn.

Mục đích của thành viên cbSize trong một số cấu trúc C++ trên Win32API là gì?

Trả lời

10

Dự đoán ban đầu của tôi là điều này có thể được sử dụng để phiên bản .

Đó là một lý do. Tôi nghĩ nó bình thường hơn.

Loại khác dành cho các cấu trúc có dữ liệu độ dài thay đổi.

Tôi không nghĩ rằng việc kiểm tra đóng gói hoặc lỗi chính xác trong người gọi là một lý do cụ thể đằng sau nó, nhưng nó sẽ có hiệu lực đó.

0

một phần versioning, chủ yếu là an toàn ... để ngăn chặn việc gọi hàm từ chọc vào bộ nhớ mà không phải là một phần của struct được thông qua vào

11

. Nó được sử dụng cho versioning. Một ví dụ điển hình là cuộc gọi GetVersionEx. Bạn có thể vượt qua hoặc là OSVERSIONINFO hoặc OSVERSIONINFOEX. OSVERSIONINFOEX là một siêu của OSVERSIONINFO, và cách duy nhất mà hệ điều hành biết bạn đã vượt qua là bởi thành viên dwOSVersionInfoSize.

+1

Các kích thước khác nhau giữa các phiên bản hệ điều hành. Tôi chỉ cần nhấn một lỗi bằng sdk nền tảng đi kèm với VC++ 2008. Chúng tôi đã không xác định chính xác phiên bản hệ điều hành và kết thúc bằng cách sử dụng phiên bản Vista của cấu trúc - không hoạt động tốt trên hộp XP của tôi. – Aardvark

2

Nó cũng cho phép các Win32 API làm một số tiền tối thiểu của sự tỉnh táo kiểm tra trên các dữ liệu được truyền trong.

Ví dụ một sai lầm commom là cho một cấu trúc Win32 để được thông qua với một không chính xác hoặc uninitialisedcbSize và khi điều này xảy ra, WIN32 API thường chỉ trả lại kết quả không thành công, thay vì cố gắng xử lý dữ liệu bị hỏng.

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