模塊定義 (.def) 文件是包含一個或多個描述 DLL 各種屬性的 Module 語句的文本文件。如果不使用 __declspec(dllexport) 關鍵字導出 DLL 的函數,則 DLL 需要 .def 文件。 .def 文件必須至少包含下列模塊定義語句: 文件中的第一個語句必須是 LIBRARY 語句。此語句將 .def 文件標識為屬於 DLL。LIBRARY 語句的後面是 DLL工程的名稱。鏈接器將此名稱放到 DLL 的導入庫中。 EXPORTS 語句列出名稱,可能的話還會列出 DLL 導出函數的序號值。通過在函數名的後面加上 @ 符和一個數字,給函數分配序號值。當指定序號值時,序號值的范圍必須是從 1 到 N,其中 N 是 DLL 導出函數的個數。 .def 文件中的注釋由每個注釋行開始處的分號 (;) 指定,且注釋不能與語句共享一行。 創建新的動態鏈接庫DLL項目 1.創建靜態項目MathFucsDll 選擇 win32項目-->輸入MathFuncsDll項目名稱->下一步->選擇DLL;選擇附加選項的空項目->完畢。(或者不選選擇附加選項的空項目也行,就是默認) 2.創建庫函數 [cpp] //MyMathFuncs.cpp int nDataBase=1;//全局變量 int Add(int a,int b) { return (a+b)*nDataBase; } int _stdcall Sub(int a,int b) { return (a-b)*nDataBase; } int _cdecl Multiply(int a,int b) { return a*b; } 3.創建def文件 [cpp] //MyMathFuncs.def //LIBRARY和EXPORTS不可以小寫,且LIBRARY後面的名稱要與工程名相同 ; LIBRARY MathFuncsDll EXPORTS Add @3 Sub @5 Multiply @1 nDataBase DATA ;nDataBase全局變量,只寫 (nDataBase);(nDataBase data);(nDataBase @2)都行 創建引用動態鏈接庫的應用程序 1.創建引用動態鏈接庫的控制台應用程序: 在同一個解決方案中添加項目MyExecRefsDll:選擇 win32控制台應用程序->輸入MyExecRefsDll項目名稱->下一步->選擇控制台應用程序;選擇附加選項的空項目->完畢 2.在應用程序中使用動態鏈接庫的功能 項目,引用->通用屬性->框架和引用->添加引用->會出現MathFuncsDll的項目名稱和項目目錄->確定 (最簡單的一種) 或者是,添加庫目錄及附加庫:項目,屬性->連接器->常規->附加庫目錄:如$(OutDir) 項目,屬性->連接器->輸入->附加依賴項:MathFuncsDll.lib;或者是在代碼中添加:#pragma comment(lib,"MathFuncsDll.lib") 且MathFuncsDll.dll必須與MyExecRefsDll.exe文件在同一個目錄 3.程序 [cpp] #include "stdafx.h" #include <iostream> using namespace std; extern int _declspec(dllimport) nDataBase;//引用dll中的全局變量 //聲明函數,需與Dll中的函數定義一致(包括其函數調用修飾詞) int Add(int a,int b); int _stdcall Sub(int a,int b); int _cdecl Multiply(int a,int b); int _tmain(int argc, _TCHAR* argv[]) { nDataBase=2; cout<<Add(1,2)<<endl;//6 cout<<Sub(3,4)<<endl;//-2 cout<<Multiply(4,5)<<endl;//20 return 0; } 比較使用_declspec(dllexport)與使用.def文件來導出Dll函數的異同 相同:創建項目和引用動態庫相同 不同: 定義時:.def的要有其文件(LIBRARY EXPORTS),而另外一種則需要在其函數前添加_declspec(dllexport) 使用時:.def使用函數前要有函數聲明,而使用_declspec(dllexport)的要添加頭文件