1. 程式人生 > >回顧一下C++ 編寫DLL

回顧一下C++ 編寫DLL

short 導出函數 article details depends 開始 工程 https -i

項目模版使用Win32工程創建的dll項目

一、原始代碼
技術分享圖片

使用depends查看導出函數
技術分享圖片

二、不同編譯方式區別

C方式編譯(extern "C"):

  1. __stdcall調用約定:輸出名稱在原名稱前加一下劃線,後面再加上一個“@”和其參數的總字節數(_原名稱@參數總字節數),如名稱int Func_C_stdcall(int a,int b)輸出為_Func_C_stdcall@8;
  2. __cdecl調用約定:與原名稱相同,如名稱int Func_C_cdecl(int a,int b)輸出還是為Func_C_cdecl;

C++方式編譯(extern "C++"):

__stdcall調用約定:

  1. 輸出名稱以“?”開始,後跟原名稱;
  2. 原名稱後再跟“@@YG”,後面再跟返回值代號和參數表代號,代號表示如下:
    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--表示指針,後面的代號表明指針類型,如果相同類型的指針連續出現,以“0”代替,一個“0”代表一次重復;
  3. 參數表後以“@Z”標識整個名字的結束,如果該函數無參數,則以“Z”標識結束。如名稱int Func_CPP_stdcall(int a,int b)編譯後的輸出名稱為?Func_CPP_stdcall@@YGHHH@Z。

__cdecl調用約定:與_stdcall調用約定基本一致,只是參數表的開始標識由上面的“@@YG”變為“@@YA”。如名稱int Func_CPP_cdecl(int a,int b)編譯後輸出名稱為?Func_CPP_cdecl@@YAHHH@Z。
編譯C文件和編譯CPP文件,不需加extern "C"和extern "C++",因為編譯C文件當然默認的是extern "C",而編譯CPP文件則默認的是extern "C++"。

第二部分轉自:https://blog.csdn.net/beanjoy/article/details/9136127

回顧一下C++ 編寫DLL