2016-08-12 46 views
1

在一些Windows API中,例如Module32NextModule32First,Process32Next,Thread32Next等,程序員被迫設置結構體的結構域爲dwSize。爲什麼Windows讓我們這樣做?這些結構是不是由Windows自己定義的?尺寸不是已知的常數? PS:我看着這些函數,發現它們只是檢查大小是否等於硬編碼常量。爲什麼Windows會讓我們在某些API中指定結構的大小?

+1

尺寸可能因版本而異。 –

+2

[爲什麼嚴格檢查結構尺寸?](https://blogs.msdn.microsoft.com/oldnewthing/20031212-00/?p=41523) – andlabs

+0

您如何知道它是否是[BITMAPINFO](https: //msdn.microsoft.com/en-us/library/dd183375.aspx)結構,或[BITMAPCOREINFO](https://msdn.microsoft.com/en-us/library/dd183373.aspx)結構,然後[BITMAPFILEHEADER](https://msdn.microsoft.com/en-us/library/dd183374.aspx),如果這些結構沒有指定它們的大小? – IInspectable

回答

2

約Thread32First功能says官方信息:

Thread32First改變的dwSize到寫入 結構的字節數。這絕不會大於初始值 dwSize,但它可能會更小。如果值較小,則不要依賴 其偏移量大於此值的任何成員的值。

我的理解是,在dwSize指定一個值,我們告訴Windows我們不需要其他「其偏移量是大於這個值的成員」。

(編輯)經過一些測試,我相信現在correct answer是從哈利約翰斯頓的。

+1

該文件沒有說你可以做到這一點。 (我並不完全確定它不適用於這些特定的功能,但它[當然不在一般情況下](https://blogs.msdn.microsoft.com/oldnewthing/20031212-00/? p = 41523)。) –

+0

@哈利約翰斯頓:你死定了。我只是做了一些測試,在'dwSize'中嘗試了不同的值,除了當給dwSize指定結構體THREADENTRY32的全部大小時,就是(在Delphi中):'dwSize:= SizeOf(TThreadEntry32);' –

4

通過要求程序員指定結構的大小,Windows可以知道程序員正在使用哪種版本的結構。一些這樣的結構實際上在不同版本的Windows之間發生了變化,有些則沒有 - 但是提供這種大小意味着微軟可以選擇在需要時更改它,而不會破壞現有的應用程序。

+0

由於它是您提到的API之一,因此應該注意Thread32First()是一種特殊情況,因爲它還*返回該字段中的值。據我所知,這是唯一的功能。我不知道爲什麼! –

相關問題