建立部分:
1.使用導出函數關鍵字_declspec(dllexport)建立:程序員
//DllTest.h extern "C" _declspec(dllexport) int Max(int a, int b); //導出聲明 extern "C" _declspec(dllexport) int Min(int a, int b); //DllTest.cpp #include "DllTest.h" int Max(int a, int b) { return (a>=b)?a:b; } int Min(int a, int b) { return (a<=b)?a:b; }
2.使用模塊文件(;後的一行表明註釋) VS2012 沒有實驗成功函數
;DllTest.def
LIBRARY DllTest
EXPORTS
Max@1
Min@2spa
.def 文件的規則爲:
(1)LIBRARY 語句說明.def 文件相應的 DLL;
(2)EXPORTS 語句後列出要導出函數的名稱。能夠在.def 文件中的導出函數名後加@n,表示要導出函數的序號爲 n(在進行函數調用時,這個序號將發揮其做用);
(3).def 文件中的註釋由每一個註釋行開始處的分號 (;) 指定,且註釋不能與語句共享一行。.net
使用部分:指針
採用隱式連接方式創建一個DLL文件,連接程序會自動生成一個與之對應的LIB導入文件。該文件包含了每個DLL導出函數的符號名和可選的標識號,可是並不含有實際的代碼。LIB文件做爲DLL的替代文件被編譯到應用程序項目中。code
//UseDll.h 聲明 #pragma comment(lib,"DllTest.lib") extern "C"_declspec(dllimport) int Max(int a,int b); //導入聲明 extern "C"_declspec(dllimport) int Min(int a,int b); //UseDll.cpp #include"Dlltest.h" void main() { printf("MinValue:%d\n",min(8,10) ); }
顯式連接,程序員就沒必要再使用導入文件,而是直接調用Win32的LoadLibary函數,並指定DLL的路徑做爲參數。LoadLibary返回HINSTANCE參數,應用程序在調用GetProcAddress函數時使用這一參數。GetProcAddress函數將符號名或標識號轉換爲DLL內部的地址。get
#include "stdafx.h" #include <Windows.h> typedef int(*pMax)(int a,int b);//定義與動態庫中的函數類型相同的指針類型 int _tmain(int argc, _TCHAR* argv[]) { pMax MaxFunc; HINSTANCE hDLL; //DLL 句柄 hDLL=LoadLibrary("TestDemo_CreateDll.Dll");//加載動態連接庫文件 MaxFunc=(pMax)GetProcAddress(hDLL,"Max"); int MaxValue=MaxFunc(5,8); printf("兩數最大值:%d\n",MaxValue); FreeLibrary(hDLL);//卸載Dll文件 return 0; }