我目前正在學習如何鏈接/編譯工作,只是來到關於進口的.exe文件的主題。我發現(Microsoft)Linker可能需要Win32 SDK中的.lib文件來解析外部函數。例如,如果您想使用user32.dll
中的MessageBoxA
,您實際上需要user32.lib中的[email protected]
地址來解決此問題。那麼,用戶/程序員怎麼可能找出我需要解析它的哪個「Prefix」? (與其他User32/Kernel32函數一樣...)獲取.lib地址
Q
獲取.lib地址
2
A
回答
1
_MessageBoxA @ 16是編譯器從WinUser.h #include文件聲明中生成的符號。這是一個裝飾的名稱,下劃線和@後綴用於聲明爲__stdcall的函數。名稱裝飾有助於在鏈接時識別聲明錯誤。但是,實際上並沒有用於winapi函數,它們沒有未修飾的名稱。主要是爲了方便使用GetProcAddress()。
User32.lib是不是一個正常庫,它是一個導入庫。它不包含MessageBoxA的代碼,它僅包含由user32.dll導出的所有函數的列表。它包含從編譯器生成的名稱_MessageBoxA @ 16到它從user32.dll,MessageBoxA實際導出的名稱的映射。當他們構建user32.dll時,Microsoft使用「模塊定義文件」a .def file來創建此映射。
鏈接器使用user32.lib來解析符號。它從導入庫中知道如何使用導出函數的正確名稱在EXE中創建導入表項。
相關問題
- 1. 獲取IP地址
- 2. 獲取從地址
- 3. 獲取MAC地址
- 4. 獲取IP地址
- 5. 獲取地址_components
- 6. 獲取IP地址
- 7. MKAnnotation獲取地址
- 8. 獲取本地IP地址
- 9. 獲取IP地址的mac地址
- 10. Google Maps API - 獲取地址到地址
- 11. C#獲取mac地址獲取服務器mac地址
- 12. 從arp獲取IP地址
- 13. 獲取指針的地址
- 14. ABPeoplePickerNavigationController - 從ABRecordRef獲取地址
- 15. 如何獲取IP地址?
- 16. 在vb.net獲取IP地址
- 17. 從地址簿獲取kABAddressCountryCodeKey
- 18. 獲取URL從地址欄
- 19. 從bssid獲取IP地址
- 20. VB.Net獲取偏移地址
- 21. 獲取MAC地址C#
- 22. 獲取地址的位置
- 23. IPv6地址獲取功能?
- 24. GNAT.Sockets獲取MAC地址
- 25. 獲取我的IP地址
- 26. 如何獲取IP地址?
- 27. 安卓獲取Mac地址
- 28. 從gdb.Value獲取地址
- 29. 獲取Shpping地址郵編
感謝您的信息。但是,這仍然不能解釋如何找出用於user32.lib或kernel32.lib等函數的名稱。它可以在WinUser.h中定義,但是作爲程序員,如何在沒有WinUser的情況下找到名稱。H?!有沒有紀錄片? – 2013-03-03 02:59:02
嗯,它的確如此,我在答案中多次使用了「映射」這個詞。按照我爲.def文件提供的鏈接查看這些映射是如何創建的。 – 2013-03-03 03:00:43
我想你可能會誤解我的問題。假設我想使用VirtualAlloc函數,該函數在.obj文件中聲明爲'VirtualAlloc'外部函數,可能會導致錯誤或根本不導入。我實際上必須使用_VirtualAlloc @ 16,否則我甚至可以使用_VirtualAlloc @ 900或_VirtualAlloc @ 12345。那麼我怎麼知道哪個是正確的名字? – 2013-03-03 03:39:41