如何匯出 Visual C++ 中的 32 位元 DLL 檔案中的類似 PASCAL 的符號

文章翻譯 文章翻譯
文章編號: 140485 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

在 32 位元版本的 Visual C++ 中沒有任何 _pascal 關鍵字。Windef.h 標頭檔具有 PASCAL 的而是定義為 __stdcall。 這會建立正確的樣式 (呼叫函式清除堆疊) 函式的呼叫慣例,但以不同方式來修飾函式名稱。因此.dll 檔,例如) 中使用 __declspec(dllexport) 時, 裝飾的名稱在匯出而不是您想要的 PASCAL 樣式名稱,是未裝飾和全部大寫。

其他相關資訊

PASCAL 名稱裝飾是只是未裝飾的符號名稱以大寫的字母。__stdcall 名稱裝飾符號名稱,以底線 (_) 開頭,並且將附加至具有符號一個 at 符號 (@ 字元後面的引數清單 (所需的堆疊空間) 中的位元組數目)。如此當宣告為函式:
   int  __stdcall func (int a, double b)
				
做為裝飾:
   _func@12
				
[C 呼叫慣例 (__cdecl) 會裝飾 _func 與名稱。而您想要的 PASCAL 樣式名稱則 FUNC。

若要取得裝飾的名稱設定 [連結器一般類別設定中的 [產生對應檔選項]。

使用 __declspec(dllexport) 會執行下列作業:
  • 如果以 C 呼叫慣例匯出函式 (_cdecl) 它帶前置底線 (_) 時名稱匯出。
  • 如果匯出函式並不會使用 C 呼叫慣例,例如是 __stdcall,它將匯出裝飾的名稱。
因此要模擬 PASCAL 名稱裝飾和呼叫慣例,您必須擁有"撥號函數堆疊清除"使用 __stdcall 和未裝飾的大寫名稱來提供。

因為沒有任何方法可以覆寫誰清理並堆疊,您必須使用 __stdcall。若要 undecorate 與 __stdcall 名稱,您必須指定使用別名中匯出它們.def 檔的區段。這如下所示為下列的函式宣告:
   int  __stdcall MyFunc (int a, double b);
   void __stdcall InitCode (void);
				
在.def 檔:
   EXPORTS
      MYFUNC=_MyFunc@12
      INITCODE=_InitCode@0
				
對於由以 32 位元版本的 Visual Basic 撰寫的程式呼叫的.dll 檔案 (版本 4.0 和上述),本文所示的別名技巧需要在.def 檔中。如果別名做 Visual 的基本程式中,並不需要使用.def 檔中的別名。它可透過在 Visual Basic 程式 Declare 陳述式加入別名子句,如下所示:
Declare Function MyFunc Lib "dlllibname" Alias "_MyFunc@12"  (...)
   As Integer
				
Visual Basic 宣告陳述式的完整語法如下:
   [Public | Private ] Declare Function name Lib
   "libname" [Alias "aliasname" ] [([arglist])][As type]
				

參考

如需詳細資訊查詢 MSDN 光碟片,使用這些關鍵字:
VB 別名 DLL
注意: 檔案 Vb4dll.txt 在 Visual Basic 目錄中找可以到 (使用範例程式碼) 的從 Visual Basic 呼叫 C 的.dll 檔案 A 極佳討論。如果您不可以尋找 Vb4dll.txt 檔案,請參閱下列的 「 Microsoft 知識庫 」 中的文件:
150705使用 VB4DLL.TXT 檔案來為 Visual Basic 開發的 DLL

屬性

文章編號: 140485 - 上次校閱: 2005年6月2日 - 版次: 3.0
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbhowto kbcompiler kbinfo KB140485 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:140485
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com