如何建立不含.OBJs 或來源的 32 位元匯入程式庫

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

在此頁中

結論

本文說明如何建立給定的.DLL,您有沒有來源的程式碼或物件模組匯入程式庫。可以從一個.DLL 建立匯入程式庫沒有 32 位元公用程式為 16 位元版本的 Visual C++ 時發生。

注意: 此方法可能不適用於使用非 Microsoft 開發工具產生的 DLL。

其他相關資訊

通常,何時建置一個.DLL 或任何目標,將函式或資料項目匯入程式庫匯出 (並將檔案匯出) 產生做為連結的程序的一部分。但第三方廠商.DLL (並不隨附匯入程式庫的情況下您可能需要產生匯入程式庫,才能使用.DLL 順利使用 [載入時間動態連結。匯入程式庫不需要執行階段動態連結。

有兩種方法來建立匯入程式庫提供一個.DLL:
  • 使用 LIB/DEF 建立.DEF 檔案供使用: 命令。
  • 清除函式,並使用.OBJ 檔案建立模仿匯入/匯出關聯性。然後使用 LIB/DEF: 命令以建立匯入程式庫。

建立.DEF 檔

唯一的時候您可以使用.DEF 檔從,您並沒有來源程式碼的.DLL 建立匯入程式庫或物件模組是.DLL 匯出函式透過 C 的介面。特別,函式需要宣告為使用 C 呼叫慣例。這是由 _cdecl 屬性通常用於原型函式指定。請注意是否指定沒有屬性 _cdecl 是預設值時 /Gz (_stdcall 是預設值) 或 /Gr (_fastcall 是預設值) 不在 CL 命令列上指定。這項限制的原因是以所做的所有名稱會自動匯都出沒有前置的底線 LIB 公用程式是假設為基礎。這僅為 true _cdecl 函式名稱。

透過 C 的介面匯出的函式與給定一個.DLL,您可以建立匯入程式庫請依照下列步驟執行:
  1. 用以 DUMPBIN /EXPORTS <.DLL 檔案名稱 > 為有問題.DLL 取得匯出符號的清單。該符號會出現在表格的 [名稱] 欄的標題是序數提示名稱。
  2. 建立.DEF 檔包含列在 「 名稱 」 欄位 DUMPBIN 輸出的函式] 以這些名稱在 [匯出] 區段。
  3. 對於 _cdecl 函式的符號會出現在呼叫程式中使用時一樣。 只要這個符號置於.DEF 檔的匯出區段。
  4. 使用 LIB/DEF: <.DEF 檔案名稱 > 以產生匯入程式庫和匯出檔案。匯入程式庫的基底的名稱將會是.DEF 檔的主檔名。 使用/OUT: 若要控制輸出程式庫名稱。

stubbing 出函式

匯出函式使用而不是 C 呼叫慣例,對於這種情況是有點複雜。當您考慮 C + + 函式和更複雜的名稱裝飾配置相關,這是如此。若要請使用這個方法您至少必須描述.DLL 的介面的標頭檔。

若要從標頭檔中的原型建立 stubbed 函式:
  1. 當 __declspec(dllimport)"用於原型 (Prototype) 或宣告時,時將它變更為"__declspec(dllexport)]。
  2. 不要傳回 C 函式在 C 原始程式中的值和針對 C 函式 (搭配 'extern"C"' 建構) 的 C + + 原始程式碼中,成分號的函式,會終止函式原型 (Prototype) 以符合對大括號 ({})。
  3. 對於 C + + 函式 (全域或成員),傳回值,您必須建立虛設的內文,要讓函數,然後傳回空值的適當的型別。(在函式沒有傳回陳述式是不合法)。 這會為類別成員式,也。請記住,此程序的目的是要欺騙 LIB 公用程式到產生正確的匯入文件庫,所以這些虛設的主體都沒有作用。
  4. 您可以為 C + + 類別 Stub 出使用原型類別宣告中的 [成員] 函數,只要停用函式內嵌當您編譯。
  5. 由標頭檔中的型別通常只指定函式的引數。 比方說 Geta(int)。新增虛擬函式主體 Geta(int x) 時,必須指定空引數識別項。否則 C2055,就會產生的錯誤。

範例

如果描述 MYDLL.DLL 標頭檔看起來像:
// mydll.H

extern "C" __declspec(dllimport) void _stdcall Function(void);

class __declspec(dllimport) CMyClass {
     int a;
     long b;
public:
     int Geta(int);
     long Getb();
     CMyClass();
};
				
使用建置匯入程式庫的虛設的原始程式檔看起來應該像:
 // mydll.CPP

 extern "C" __declspec(dllexport) void _stdcall Function(void) {}

 class __declspec(dllexport) CMyClass {
      int a;
      long b;
 public:
      int Geta(int x) {return 111;}
      long Getb() {return 111;}
      CMyClass() {}
 };
				
一旦函式 stubbed,您只需要是編譯原始程式檔到.OBJ 檔案:
CL/c /Ob0 mydll.CPP
注意: 停用內嵌函式,才能強制為 CMyClass 中定義該函式產生的符號。如果已啟用函式內嵌,編譯器,會注意到沒有參考成員函式轉譯單元讓它會捨棄函式主體。最佳化下 Visual C++ CL 命令列參照中的內嵌函式展開,請參閱討論區。

一旦您有.OBJ 檔案,您可以使用 LIB/DEF: 若要建立匯入程式庫 (.LIB) 和匯出檔 (.EXP):
LIB/DEF: mydll.OBJ
LIB 命令上的詳細資訊,參考 < LIB 參考"[Visual C++ 線上叢書 》 中。

而且,請參閱下列文件 「 Microsoft 知識庫 」 中:
140485匯出在 32 位元 DLL PASCAL 類似符號

屬性

文章編號: 131313 - 上次校閱: 2004年6月29日 - 版次: 2.1
這篇文章中的資訊適用於:
  • The Microsoft Library Manager (LIB.EXE)?應用於:
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
關鍵字:?
kbmt kb3rdparty kbcode kbhowto KB131313 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:131313
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。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