回覆列表
  • 1 # 使用者660787241224

    模組定義 (.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)的要新增標頭檔案。

  • 中秋節和大豐收的關聯?
  • 土耳其屢次申請加入歐盟被拒,美國也肆意制裁土耳其。如此被無視,難道土耳其有短板嗎?