在一些Windows API中,例如Module32Next
,Module32First
,Process32Next
,Thread32Next
等,程序員被迫設置結構體的結構域爲dwSize
。爲什麼Windows讓我們這樣做?這些結構是不是由Windows自己定義的?尺寸不是已知的常數? PS:我看着這些函數,發現它們只是檢查大小是否等於硬編碼常量。爲什麼Windows會讓我們在某些API中指定結構的大小?
回答
約Thread32First功能says官方信息:
Thread32First改變的dwSize到寫入 結構的字節數。這絕不會大於初始值 dwSize,但它可能會更小。如果值較小,則不要依賴 其偏移量大於此值的任何成員的值。
我的理解是,在dwSize
指定一個值,我們告訴Windows我們不需要其他「其偏移量是大於這個值的成員」。
(編輯)經過一些測試,我相信現在correct answer是從哈利約翰斯頓的。
該文件沒有說你可以做到這一點。 (我並不完全確定它不適用於這些特定的功能,但它[當然不在一般情況下](https://blogs.msdn.microsoft.com/oldnewthing/20031212-00/? p = 41523)。) –
@哈利約翰斯頓:你死定了。我只是做了一些測試,在'dwSize'中嘗試了不同的值,除了當給dwSize指定結構體THREADENTRY32的全部大小時,就是(在Delphi中):'dwSize:= SizeOf(TThreadEntry32);' –
通過要求程序員指定結構的大小,Windows可以知道程序員正在使用哪種版本的結構。一些這樣的結構實際上在不同版本的Windows之間發生了變化,有些則沒有 - 但是提供這種大小意味着微軟可以選擇在需要時更改它,而不會破壞現有的應用程序。
由於它是您提到的API之一,因此應該注意Thread32First()是一種特殊情況,因爲它還*返回該字段中的值。據我所知,這是唯一的功能。我不知道爲什麼! –
- 1. 爲什麼bind()和accept()讓你指定結構的大小?
- 2. 爲什麼結構大小不正確
- 3. 爲什麼某些值會使struct.pack和struct.unpack在Windows上失敗?
- 4. 爲什麼knockout.mapping在某些數據結構上失敗?
- 5. 爲什麼我們只在某些時候省略括號?
- 6. 爲什麼Foursquare API只能爲某些座標生成結果?
- 7. 什麼時候應該malloc指針的大小與結構本身的大小?
- 8. PHP不讓我輸出某些網站的html,爲什麼?
- 9. 爲什麼LINQ to Entities不會讓我初始化實體的某些屬性?
- 10. 爲什麼Windows掛鉤不會收到某些消息?
- 11. 爲什麼我會得到「指向未知結構的指針增量」?
- 12. 爲什麼我們不能初始化結構中的成員?
- 13. 如果我們在web api中指定Frombody和FromUri屬性,我們會得到什麼好處?
- 14. 爲什麼iPhone在翻頁時會讓我的文字變大?
- 15. 爲什麼我們需要在Apache Kafka中指定Serializer?
- 16. 爲什麼我們需要在Spring中指定HttpMessageConverter?
- 17. 爲什麼我們在string.xml中指定字符串
- 18. 爲什麼我們在iOS中測試時指定「弱」?
- 19. SYSTEM_PROCESS_INFORMATION結構中的某些成員有什麼含義?
- 20. 給定結構的大小
- 21. 將較大結構的指針轉換爲較小結構的指針
- 22. 在Windows窗體中,爲什麼.resx文件中的某些文本無法正確顯示大寫/小寫?
- 23. 爲什麼我的HttpClient類凍結某些URL
- 24. 爲什麼Chrome會在jQuery中的某些行上暫停?
- 25. 爲什麼我們沒有釋放一個結構的嵌入指針用C
- 26. 爲什麼C結構定義中有嵌套的指針?
- 27. 爲什麼這些正則表達式測試會讓某些字符通過?
- 28. 爲什麼我們要在堆棧和堆上管理結構
- 29. 時,爲什麼我們使用結構在C#
- 30. 爲什麼我應該在VBA中確定變量的大小?
尺寸可能因版本而異。 –
[爲什麼嚴格檢查結構尺寸?](https://blogs.msdn.microsoft.com/oldnewthing/20031212-00/?p=41523) – andlabs
您如何知道它是否是[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