測試環境vs2008
一、關於動態鏈接庫
1、使用動態鏈接庫時,一般都需要兩個文件:靜態庫(引入庫).lib和動態庫.dll
2、加載方式:
隱式鏈接,編譯工程時,需要先添加.lib文件。可以直接通過編譯環境添加,還可以通過代碼添加(#pragma comment (lib,"XXX.lib"))
動態鏈接:通過下面幾個函數實現,LoadLibrary("XXX.dll"); GetProAddress(); FreeLibrary();
二、關於extern "C"、__cdecl、__stdcall(這裏是雙下劃線,雙下劃線和單下劃線是有區別的)
1、首先這三個聲明會使編譯時生成的符號庫中的名字發生變化。具體信息可以進行百度搜索這三個關鍵字。
2、我們可以創建一個Dll工程,然後分別用這三個關鍵字來聲明函數,然後用命令窗口cmd,進行dumpbin命令查看相關到處函數和變量信息,在其中就能看到鏈接的函數名變化。具體操作可以參見:http://blog.csdn.net/blpluto/article/details/5706757
3、所以爲了使dll文件在跨平臺的時候能使用原本的函數名進行調用。我們可以在dll工程下創建一個Module-Definition File(.def)文件,進行導出函數名的定義。代碼如下:
LIBRARY"Dllexercise"
EXPORTS
add
三、部分測試代碼(dll文件中只導出了一個函數add,然後在MFC下的多文檔工程中創建一個對話框進行函數調用)
dll工程中文件:
1、Dll.h代碼
#ifdef DLL_API
#else
#define DLL_API /*extern "C" */_declspec(dllimport)
#endif
DLL_API int/* __stdcall*/ add(int a,int b);
2、Dll.cpp代碼
#define DLL_API /*extern "C" */_declspec(dllexport)
#include "Dll1.h"
int /*__stdcall*/ add(int a, int b)
{
return a+b;
}
3、Dll1.def代碼
LIBRARY "Dllexercise"
EXPORTS
add
DllTest工程中部分代碼:
1、在要調用add函數的文件中添加語句(記得把dll工程下的.dll文件和.lib文件複製到本工程目錄下)
#include "Dll1.h"
#pragma comment(lib,"Dllexercise.lib")
具體代碼已上傳到:http://download.csdn.net/detail/u013617648/8930511 免積分下載