2008-10-09 23 views
7

我經常遇到一些有如下示例中cbSize成員的Win32API結構(但不限於此)的一些定義。Win32API結構中cbSize成員的作用是什麼

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

然後我們使用這樣的:

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

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

我最初的猜測是,這有可能被用於版本。接收像這樣的結構指針的DLL可以檢查成員是否具有用於編譯DLL的預期值。或者檢查是否對結構進行了適當的包裝。但我想從你這裏來。

Win32API上的一些C++結構中的cbSize成員的目的是什麼?

回答

10

我最初的猜測是,這可能是 可能用於版本控制。

這就是其中一個原因。我認爲這是比較平常的。

另一種用於具有可變長度數據的結構。

我不認爲在調用者中檢查正確的包裝或錯誤是它背後的一個特別的推理,但它會產生這種效果。

0

部分版本,主要是安全...爲防止被調用函數從捅到內存中,這是不是在通過結構的一部分。

11

它用於版本。一個很好的例子是GetVersionEx電話。您可以通過OSVERSIONINFOOSVERSIONINFOEX。 OSVERSIONINFOEX是OSVERSIONINFO的超集,操作系統知道你傳入的唯一方法是由dwOSVersionInfoSize成員。

+1

在OS版本之間,工具的大小也不盡相同。我剛剛使用VC++ 2008附帶的平臺sdk發現了一個bug。我們沒有正確定義操作系統版本,並最終使用了Vista版本的一個結構 - 這在XP盒子上效果不佳。 – Aardvark 2008-10-10 02:22:49

2

它也讓WIN32 API做理智上的數據檢查的最小量在被傳遞。

例如一個黎民錯誤爲WIN32結構要傳遞在與不正確未初始化CBSIZE,當這種情況發生的WIN32 API通常只是返回一個失敗的結果,而不是嘗試處理這似乎被損壞的數據。