動態連接庫的創建步驟:
一、創建Non-MFC DLL動態鏈接庫
1、打開File —> New —> Project選項,選擇Win32 Dynamic-Link Library —>sample project
—>工程名:DllDemo
2、新建一個.h文件DllDemo.h
以下是引用片段:
#ifdef DllDemo_EXPORTS
#define DllAPI __declspec(dllexport)
#else
#define DllAPI __declspec(dllimport)
extern "C" //原樣編譯
{
DllAPI int __stdcall Max(int a,int b); //__stdcall使非C/C++語言內能夠調用API
}
#endif
3、在DllDemo.cpp文件中導入DllDemo.h文件,並實現Max(int,int)函數
以下是引用片段:
#include "DllDemo.h"
DllAPI int __stdcall Max(int a,int b)
{
if(a==b)
return NULL;
else if(a>b)
return a;
else
return b;
}
4、編譯程序生成動態連接庫
二、用.def文件創建動態連接庫DllDemo.dll。
1、刪除DllDemo工程中的DllDemo.h文件。
2、在DllDemo.cpp文件頭,刪除 #include DllDemo.h語句。
3、向該工程中加入一個文本文件,命名為DllDemo.def並寫入如下語句:
LIBRARY MyDll
EXPORTS
Max@1
4、編譯程序生成動態連接庫。
動態鏈接的調用步驟:
一、隱式調用
1、 建立DllCnslTest工程
2、 將文件DllDemo.dll、DllDemo.lib拷貝到DllCnslTest工程所在的目錄
3、 在DllCnslTest.h中添加如下語句:
以下是引用片段:
#define DllAPI __declspec(dllimport)
#pragma comment(lib,"DllDemo.lib") //在編輯器link時,鏈接到DllDemo.lib文件
extern "C"
{
DllAPI int __stdcall Max(int a,int b);
}
4、在DllCnslTest.cpp文件中添加如下語句:
以下是引用片段:
#include "DllCnslTest.h"//或者 #include "DllDemo.h"
void main()
{
int value;
value = Max(2,9);
printf("The Max value is %d
",value);
}
5、編譯並生成應用程序DllCnslTest.exe
二、顯式調用
1、 建立DllWinTest工程
2、 將文件DllDemo.dll拷貝到DllWinTest工程所在的目錄或Windows系統目錄下。
3、 用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函數結構。
4、 使用類型定義要害字typedef,定義指向和DLL中相同的函數原型指針。
例:
以下是引用片段:
typedef int(*lpMax)(int a,int b); //此語句可以放在.h文件中
5、 通過LoadLibray()將DLL加載到當前的應用程序中並返回當前DLL文件的句柄。
例:
以下是引用片段:
HINSTANCE hDll; //聲明一個Dll實例文件句柄
hDll = LoadLibrary("DllDemo.dll");//導入DllDemo.dll動態連接庫
6、 通過GetProcAddress()函數獲取導入到應用程序中的函數指針。
例:
以下是引用片段:
lpMax Max;
Max = (lpMax)GetProcAddress(hDLL,"Max");
int value;
value = Max(2,9);
printf("The Max value is %d",value);
7、 函數調用完畢後,使用FreeLibrary()卸載DLL文件。
FreeLibrary(hDll);
8、 編譯並生成應用程序DllWinTest.exe
注:顯式鏈接應用程序編譯時不需要使用相應的Lib文件。