2013-03-03 51 views
2

我目前正在學習如何鏈接/編譯工作,只是來到關於進口的.exe文件的主題。我發現(Microsoft)Linker可能需要Win32 SDK中的.lib文件來解析外部函數。例如,如果您想使用user32.dll中的MessageBoxA,您實際上需要user32.lib中的[email protected]地址來解決此問題。那麼,用戶/程序員怎麼可能找出我需要解析它的哪個「Prefix」? (與其他User32/Kernel32函數一樣...)獲取.lib地址

回答

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中創建導入表項。

+0

感謝您的信息。但是,這仍然不能解釋如何找出用於user32.lib或kernel32.lib等函數的名稱。它可以在WinUser.h中定義,但是作爲程序員,如何在沒有WinUser的情況下找到名稱。H?!有沒有紀錄片? – 2013-03-03 02:59:02

+0

嗯,它的確如此,我在答案中多次使用了「映射」這個詞。按照我爲.def文件提供的鏈接查看這些映射是如何創建的。 – 2013-03-03 03:00:43

+0

我想你可能會誤解我的問題。假設我想使用VirtualAlloc函數,該函數在.obj文件中聲明爲'VirtualAlloc'外部函數,可能會導致錯誤或根本不導入。我實際上必須使用_VirtualAlloc @ 16,否則我甚至可以使用_VirtualAlloc @ 900或_VirtualAlloc @ 12345。那麼我怎麼知道哪個是正確的名字? – 2013-03-03 03:39:41