C DLL 導出:修飾/重整名稱
在C DLL 開發中,預計導出的函數名稱在編譯後顯示為未修飾。但是,遇到帶有附加字元的修飾函數名稱可能會引起關注。
修飾的原因
所看到的修飾是編譯器名稱重整過程的結果。編譯 C 程式碼時,編譯器會修改函數名稱以確保重載函數或不同編譯單元之間的唯一性。此重整包括其他字元和符號。
使用Pragma Comment 的解
要匯出未修飾的函數名稱,而不使用模組定義文件,可以插入pragma 註解:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
或者,取得修飾函數名稱自動:
#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
與聲明說明符等效的Extern "C"
另一種方法是使用帶有聲明說明符的extern "C":
extern "C" void __declspec(dllexport) SomeFunction();
但是,這個方法仍然會產生相同的裝飾函數name.
消除後綴
不幸的是,如果不使用模組定義檔或編譯註釋,則無法消除後綴「=」修飾。此後綴表示函數的修飾版本。
C# 應用程式的解決方法
雖然首選未修飾的名稱,但仍可以使用 C# 中的 P/Invoke 呼叫修飾函數名稱。為此,請在呼叫函數時包含完全修飾的名稱。
以上是為什麼 C DLL 導出的函數名稱有時會被修飾,如何導出未修飾的名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!