最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++ 動態(tài)庫導出函數(shù)名亂碼及解決

 更新時間:2019年03月13日 14:34:46   作者:luochenlong  
這篇文章主要介紹了C++ 動態(tài)庫導出函數(shù)名亂碼及解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

剛接觸C++,在嘗試從 dll 中導出函數(shù)時,發(fā)現(xiàn)導出的函數(shù)名都“亂碼”了。

導出過程如下:

新建一個Win32項目:

新建的解決方案里有幾個導出的示例:

// 下列 ifdef 塊是創(chuàng)建使從 DLL 導出更簡單的
// 宏的標準方法。此 DLL 中的所有文件都是用命令行上定義的 DLLEXPORT_EXPORTS
// 符號編譯的。在使用此 DLL 的
// 任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將
// DLLEXPORT_API 函數(shù)視為是從 DLL 導入的,而此 DLL 則將用此宏定義的
// 符號視為是被導出的。
#ifdef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif

// 此類是從 dllExport.dll 導出的
class DLLEXPORT_API CdllExport {
public:
 CdllExport(void);
 // TODO: 在此添加您的方法。
};

extern DLLEXPORT_API int ndllExport;

DLLEXPORT_API int fndllExport(void);

于是我什么都不做,直接生成,并且在C#里導入看看能否調(diào)用,嗯……錯誤來了:

找不到入口點?難道是沒導出么?我們用“Dependency Walker”來看看:

Oh, shit, WTF is this? 導出是導出了,不過怎么都亂碼了?

右鍵選擇“Undecorate C++ Functions”之后才出現(xiàn)了真面目:

不過我們的目的是要在C#中使用,而不是用眼睛在 Dependency 里面看??!嗯,既然入口點的名字都變了,要不我們在 C# 中手動指定入口點試試?

不錯,成功了,我們終于可以使用 C++ dll里導出的函數(shù)了。

不過,這些亂碼到底是什么東西?百度一下很輕松地找到了答案:

DLL(動態(tài)庫)導出函數(shù)名亂碼含義  
C++編譯時函數(shù)名修飾約定規(guī)則:    
  __stdcall調(diào)用約定:    
  1、以"?"標識函數(shù)名的開始,后跟函數(shù)名;   
  2、函數(shù)名后面以"@@YG"標識參數(shù)表的開始,后跟參數(shù)表;  
  3、參數(shù)表以代號表示:    
  X--void 
  D--char 
  E--unsigned char 
  F--short 
  H--int 
  I--unsigned int 
  J--long 
  K--unsigned long 
  M--float 
  N--double 
  _N--bool 
  ....    
  PA--表示指針,后面的代號表明指針類型,如果相同類型的指針連續(xù)出現(xiàn),以"0"代替,一個"0"代表一次重復;    
  4、參數(shù)表的第一項為該函數(shù)的返回值類型,其后依次為參數(shù)的數(shù)據(jù)類型,指針標識在其所指數(shù)據(jù)類型前;    
  5、參數(shù)表后以"@Z"標識整個名字的結(jié)束,如果該函數(shù)無參數(shù),則以"Z"標識結(jié)束。    
  其格式為"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如    
                      int Test1(char *var1, unsigned long)-----?Test1@@YGHPADK@Z

                     void Test2()-----"?Test2@@YGXXZ" 
  __cdecl調(diào)用約定:    
  規(guī)則同上面的_stdcall調(diào)用約定,只是參數(shù)表的開始標識由上面的"@@YG"變?yōu)?@@YA"。    
  __fastcall調(diào)用約定:    
  規(guī)則同上面的_stdcall調(diào)用約定,只是參數(shù)表的開始標識由上面的"@@YG"變?yōu)?@@YI"。  

  如果要用DEF文件輸出一個"C++"類,則把要輸出的數(shù)據(jù)和成員的修飾名都寫入.def模塊定義文件    
  所以...   通過def文件來導出C++類是很麻煩的,并且這個修飾名是不可避免的

雖然有約定的含義,但這也真夠麻煩的!我不禁想,我們之前導入 User32.dll,Shell32.dll 等等這些動態(tài)庫的函數(shù)的時候,那些EntryPoint沒見這么麻煩啊,怎么回事?還是萬能的百度……“在到處函數(shù)之前加上“extern "C"”就行了!”,我們來試試:

// 下列 ifdef 塊是創(chuàng)建使從 DLL 導出更簡單的
// 宏的標準方法。此 DLL 中的所有文件都是用命令行上定義的 DLLEXPORT_EXPORTS
// 符號編譯的。在使用此 DLL 的
// 任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將
// DLLEXPORT_API 函數(shù)視為是從 DLL 導入的,而此 DLL 則將用此宏定義的
// 符號視為是被導出的。
#ifdef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif

// 此類是從 dllExport.dll 導出的
class DLLEXPORT_API CdllExport {
public:
 CdllExport(void);
 // TODO: 在此添加您的方法。
};

extern "C" DLLEXPORT_API int ndllExport;

extern "C" DLLEXPORT_API int fndllExport(void);

注意和之前對比,最后兩行有變化。編譯生成,運行 C# 項目:

沒有指定 EntryPoint 了,成功!

以上所述是小編給大家介紹的C++ 動態(tài)庫導出函數(shù)名亂碼及解決詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • c語言_構(gòu)建一個靜態(tài)二叉樹實現(xiàn)方法

    c語言_構(gòu)建一個靜態(tài)二叉樹實現(xiàn)方法

    下面小編就為大家?guī)硪黄猚語言_構(gòu)建一個靜態(tài)二叉樹實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++ 11和C++98相比有哪些新特性

    C++ 11和C++98相比有哪些新特性

    C++11標準提供了許多有用的新特性。這篇文章特別針對使C++11和C++98相比看上去像一門新語言的特性
    2017-03-03
  • C++?STL反向迭代器的實現(xiàn)

    C++?STL反向迭代器的實現(xiàn)

    本文主要介紹了C++?STL反向迭代器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 《C++ primer plus》讀書筆記(二)

    《C++ primer plus》讀書筆記(二)

    本讀書筆記是讀了《C++ primer plus(第六版)》第五至八章的學習筆記。是C++讀書筆記系列的第二篇。復習C++基礎知識的可以瞄瞄。
    2014-10-10
  • C++基礎學習之利用兩個棧實現(xiàn)一個隊列

    C++基礎學習之利用兩個棧實現(xiàn)一個隊列

    這篇文章主要給大家介紹了關(guān)于C++基礎學習之利用兩個棧實現(xiàn)一個隊列的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Ubuntu中使用VS Code與安裝C/C++插件的教程詳解

    Ubuntu中使用VS Code與安裝C/C++插件的教程詳解

    這篇文章主要介紹了Ubuntu中使用VS Code與安裝C/C++插件的教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C++算術(shù)運算符與類型轉(zhuǎn)換

    C++算術(shù)運算符與類型轉(zhuǎn)換

    這篇文章主要介紹了C++算術(shù)運算符與類型轉(zhuǎn)換,C++當中提供5種基礎的算術(shù)運算符,分別是加法、減法、乘法、除法和取模。下main我們就一起來看看下面文章得具體舉例與說明,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • C語言趣味編程之水仙花數(shù)

    C語言趣味編程之水仙花數(shù)

    這篇文章介紹了C語言趣味編程之水仙花數(shù),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-11-11
  • C++基于文件流與armadillo讀取mnist示例詳解

    C++基于文件流與armadillo讀取mnist示例詳解

    這篇文章主要給大家介紹了關(guān)于C++基于文件流與armadillo讀取mnist的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • QT網(wǎng)絡通信TCP客戶端實現(xiàn)詳解

    QT網(wǎng)絡通信TCP客戶端實現(xiàn)詳解

    這篇文章主要為大家詳細介紹了QT網(wǎng)絡通信TCP客戶端實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

三都| 沭阳县| 古浪县| 广南县| 延长县| 庆阳市| 锡林郭勒盟| 武鸣县| 靖远县| 英吉沙县| 东至县| 呼和浩特市| 榆树市| 南开区| 陕西省| 瑞金市| 长治市| 澄城县| 大姚县| 邵武市| 南投市| 拉孜县| 普定县| 万全县| 拉萨市| 东丰县| 富源县| 宜城市| 阿坝| 漳平市| 鄯善县| 扶绥县| 武乡县| 济南市| 临潭县| 株洲市| 广河县| 泽州县| 江都市| 扶沟县| 城步|