C++編譯時函數名修飾約定規則和DLL中導出函數的方法

 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的應用程序也使用該宏輸入類。框架

相關文章
相關標籤/搜索