C++編譯時函數名修飾約定規則:
__stdcall調用約定:
一、以"?"標識函數名的開始,後跟函數名;
二、函數名後面以"@@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"表明一次重複;
四、參數表的第一項爲該函數的返回值類型,其後依次爲參數的數據類型,指針標識在其所指數據類型前;
五、參數表後以"@Z"標識整個名字的結束,若是該函數無參數,則以"Z"標識結束。
其格式爲"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如
int Test1(char *var1,unsigned long)-----「?Test1@@YGHPADK@Z」
void Test2() -----「?Test2@@YGXXZ」
__cdecl調用約定:
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的"@@YG"變爲"@@YA"。
__fastcall調用約定:
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的"@@YG"變爲"@@YI"。
DLL中導出函數的方法
從DLL中導出函數通常有三種方法:
1 使用DEF文件,它是一個包含描述動態連接庫不一樣屬性模塊語句的文本文件,若是在程序中不使用_declspec(dllexport)關鍵字輸出DLL函數,則必須有一個DEF文件。
DEF文件中通常包含如下的語句:
NAME:主輸出程序或動態連接庫文件名
LIBRARY:該語句指出動態連接庫的內部名字,只是鏈接器生成動態連接庫。
DESCRIPTION:描述DLL的用途,用單引號或雙引號包含。
STACKSIZE:以字節爲單位設置堆棧的大小
SECTIONS:設置段屬性
EXPORTS:列出DLL導出函數名和其餘信息。
VERSION:給出DLL版本號
對於使用AppWizard建立的MFC DLL,AppWizard會建立一個DEF文件的框架,並自動增長到工程中,而後在DEF文件中添加用於輸出的函數。若是是建立非MFC DLL,必須本身建立DEF文件,並添加到工程總。
當創建DLL時,鏈接器會使用DEF文件建立一個輸出EXP文件和一個輸入庫LIB,而後鏈接器會利用這些輸出文件創建動態連接庫文件,使用動態連接庫的可執行程序能夠顯示的鏈接LIB文件來使用DLL文件。
2 使用_declspec(dllexport)關鍵字
可使用_declspec(dllexport)關鍵字從動態連接庫中輸出函數,數據,類或是類成員,使用該關鍵字就再也不使用DEF文件。
當要從動態連接庫中輸出函數時,_declspec(dllexport)關鍵字必須放置在輸出變量的前面,當創建一個新的動態連接庫文件時,通常會建立一個包含輸出函數原形或函數類的頭文件,而後再頭文件中加上_declspec(dllexport)關鍵字聲明,在使用上述的動態連接庫的輸出函數時,就能夠利用_declspec(dllimport)關鍵字來聲明使用的Dll輸出函數,而後能夠直接使用這些函數。
3 針對MFC擴展函數,它使用AFX_EXT_CLASS宏來導出類。
MFC擴展DLL使用AFX_EXT_CLASS宏輸出類,而使用擴展DLL的應用程序也使用該宏輸入類。框架