[英]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.