首頁 > 後端開發 > C++ > 為什麼 C DLL 導出的函數名稱有時會被修飾,如何導出未修飾的名稱?

為什麼 C DLL 導出的函數名稱有時會被修飾,如何導出未修飾的名稱?

Patricia Arquette
發布: 2024-11-12 09:30:02
原創
731 人瀏覽過

Why are C   DLL exported function names sometimes decorated, and how can I export undecorated names?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板