程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用def文件從dll導出

使用def文件從dll導出

編輯:C++入門知識

模塊定義 (.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)的要添加頭文件

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved