DLL是一個包含可由多個程序同時使用的代碼和數據的庫。
DLL文件就是把一些函數導出來,然后在新程序中進行復用的過程。
第一部分:使用Visual Studio 2010進行DLL的制作
生成方法一:
第一步:選擇創建win32應用程序
第二步:在彈出的應用程序向導中做出如下選擇:
第三步:在頭文件添加Demoone.h
代碼如下:
1 #ifndef _Demo_H_ 2 #define _Demo_H_ 3 #ifdef LIBDLL 4 #define LIBDLL extern "C" _declspec(dllimport) 5 #else 6 #define LIBDLL extern "C" _declspec(dllexport) 7 #endif 8 LIBDLL int Add(int plus1, int plus2); 9 #endif
添加Demoone.cpp
代碼如下:
#include "Demoone.h" int Add ( int a , int b ) { return ( a + b ); }
結構視圖如下:
然后點擊“生成”下的“生成解決方案”即可
在項目目錄下/debug/目錄下存在DllDemoone.lib和DllDemoone.dll
生成方法二:
該方法不需要使用_declspec(dllimport)的方式,一二步與上同。
第三步:
Demotwo.h代碼如下:
#ifndef _Demo_H_ #define _Demo_H_ extern "C" int Add (int a , int b); #endif
Demotwo.cpp和上一步驟相同
第四步:
添加def文件:在“添加新建項”中左側選擇“代碼”,新建一個模塊定義文件,名字隨意。它用來創建LIB文件內容如下:
LIBRARY "Dllmaketwo" EXPORTS Add @ 1
最終視圖如下:
生成解決方案也能得到dll文件。
第二部分:使用dll文件
當我們的程序需要使用DLL時,就需要去加載DLL,在程序中加載DLL有兩種方法,分別為加載時動態鏈接和運行時動態鏈接。
在加載時動態鏈接中,應用程序像調用本地函數一樣對導出的DLL函數進行顯示調用。要使用加載時動態鏈接,需要在編譯和鏈接應用程序時提供頭文件和導入庫文件(.lib)。當這樣做的時候,鏈接器將向系統提供加載DLL所需的信息,並在加載時解析導出的DLL函數的位置;
在運行時動態鏈接中,應用程序調用LoadLibrary函數或LoadLibraryEx函數以在運行時加載DLL。成功加載DLL后,可以使用GetProcAddress函數獲得要調用的導出的DLL函數的地址。在使用運行時動態鏈接時,不需要使用導入庫文件(lib)。
在實際編程時有兩種使用DLL的方法,那么到底應該使用那一種呢?在實際開發時,是基於以下幾點進行考慮的:
1、啟動性能 如果應用程序的初始啟動性能很重要,則應使用運行時動態鏈接;
2、易用性 在加載時動態鏈接中,導出的DLL函數類似於本地函數,我們可以方便地進行這些函數的調用;
3、應用程序邏輯在運行時動態鏈接中,應用程序可以分支,以便按照需要加載不同的模塊。
方法一:加載時動態鏈接
新建一個普通控制台項目,將DLLDemoone.lib,DLLDemoone.dll以及Demoone.h復制到和項目代碼相同的路徑下:
代碼按如下方式書寫:
#include <iostream> #include"Demoone.h"//方法a using namespace std; #pragma comment(lib, "DLLDemoone.lib") //extern "C" _declspec(dllimport) int Add(int a, int b);//方法b int main(int argc, char *argv[]) { cout<<Add(2, 3)<<endl; return 0; }
運行即可獲得正確的結果。
方法a和方法b是兩種不同方式,若使用方法b則不需要拷貝Demo.h這個頭文件。
方法二:運行時動態鏈接
新建一個普通控制台項目,將DLLDemoone.lib,DLLDemoone.dll以及Demoone.h復制到和項目代碼相同的路徑下:
#include <windows.h> #include <iostream> using namespace std; typedef int (*AddFunc)(int a, int b); int main(int argc, char *argv[]) { HMODULE hDll = LoadLibrary("DLLmaketwo.dll"); if (hDll != NULL) { AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE(1)); if (add != NULL) { cout<<add(2, 3)<<endl; } FreeLibrary(hDll); } }
在這里會碰到error C2664: “LoadLibraryW”: 不能將參數 1 從“const char *”轉換為“LPCWSTR”的問題,解決方式是將工程的字符方式進行修改即可,具體見另一篇:
http://www.cnblogs.com/holyprince/p/4236586.html
創建和使用方法大致分為以上四種,參考了兩篇文章,多謝他們:
http://www.jellythink.com/archives/111
http://www.aichengxu.com/view/14438