簡體   English   中英

在動態加載的dll中查找名稱纏結的函數

[英]Find name-mangled function in dynamically-loaded dll

我有一組明確設計為僅在C ++中使用的API。 我不希望它們被C程序(或與此有關的任何其他語言)使用,因此,我導出名稱空間和類信息,而不是走extern "C"路線並使用內聯的實用程序函數來調用純函數。 C函數。

現在,我只處理在編譯時鏈接的dll,這意味着將函數導入可執行文件非常容易,因為這對我而言沒有任何工作。 但是,我計划開發一個插件系統,這將需要我在運行時動態加載dll。 我可以使用GetProcAddress()找到名稱纏結的C ++函數嗎?

除非您控制整個構建鏈,並且可以確保您的DLL和所有使用它的應用程序都使用同一編譯器的相同版本構建,否則您執行的操作不一定是個好主意

話雖這么說,是的,您可以使用GetProcAddress加載名稱混雜的函數。 如果編譯器設置為生成一個,則只需使用Dependency Walker或查看為DLL生成的.def文件,即可獲得錯誤的函數名。 然后您可以獲取它的GetProcAddress 但是,您不能使用完整名稱來調用GetProcAddress ,並不能期望它找到正確的名稱。 例如,如果您的DLL的函數名為Add ,並且被_Z3Addv_Z3Addv ,則需要調用GetProcAddress(myDLL, "_Z3Addv"); 才能正確訪問該功能。

每次更改函數的聲明時,都需要更改對GetProcAddress的調用,因為錯誤的名稱也會更改。 請注意,如果您更改使用DLL構建的編譯器,則還需要更改GetProcAddress調用-MSVC的重整與GCC的重整非常不同,而clang的重整可能​​與二者均不同。 因此,您可能需要重新考慮執行此操作的方式,因為它似乎很容易在此過程中發生中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM