DLL全稱Dynamic Link Library,是微軟定義的動態鏈接庫類型。動態鏈接庫的好處不必多說。那么在windows下如何使用DLL呢?DLL的使用有2種方式:第一種稱之為”顯式鏈接”,只需提供DLL文件和知曉函數名即可;第二種稱之為“隱式鏈接”,需要提供lib,頭文件和dll,這種方式比較正規。首先,我們來制作一個dll文件。
打開vs2010,選擇Win32 Console Application,填入工程名”mydll”,在接下來的Application Settings設置的時候,將Application type設置為DLL,將Additional options設置為Empty project。
分別創建mydllbase.h ,mydll.h和mydll.cpp文件。文件內容如下:
mydllbase.h:
#ifndef MYDLLBASE_H #define MYDLLBASE_H class mydllbase { public: virtual ~mydllbase(){}; virtual int add(int a, int b) = 0; }; #endif
mydll.h:
#ifndef MYDLL_H #define MYDLL_H class __declspec( dllexport ) mymath: public mydllbase { public: mymath(){} int add(int a, int b); }; #endif
mydll.cpp:
#include "mydll.h" extern "C" __declspec(dllexport) mymath* getInstance() { return new mymath; } int mymath::add(int a, int b) { return a+b; }
如何導出函數,classes,詳見:
http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
編譯后生成:
Mydll.dll mydll.lib 文件。
新建一個Console Application,創建main.cpp文件,將Mydll.dll mydll.lib mydll.h mydllbase.h拷貝到main.cpp同目錄下。
顯式鏈接的方式調用dll:
只要添加 mydllbase.h 頭文件。
main.cpp:
#include <iostream> #include <cstdio> #include <Windows.h> #include "mydllbase.h" using namespace std; typedef mydllbase* (*getInstance)(); int main() { getInstance func; int sum = 0; HINSTANCE hInstLibrary = LoadLibrary(L"mydll.dll"); if (hInstLibrary == NULL) { cout<<"cannot load library"<<endl; } else { printf("load library successfully %p\n", hInstLibrary); } func = (getInstance)GetProcAddress(hInstLibrary, "getInstance"); if (func == NULL) { FreeLibrary(hInstLibrary); printf("GetProcAddress failed\n"); } else { printf("GetProcAddress load function successfully %p!\n", func); } class mydllbase* m = func(); if (m != NULL) { sum = m->add(1, 10); delete m; } cout<<"sum: "<<sum<<endl; FreeLibrary(hInstLibrary); return 0; }
執行結果:
顯然,在顯式鏈接中,我們不能直接調用class,需要通過一個全局getInstance函數,隱式地創建class的實例,同時需要創建一個基類,將所有成員函數命名成純虛函數,然后讓class繼承基類函數,來達到捕獲class實例的目的。這是多么麻煩啊!!!
以隱式鏈接的方式調用dll就簡單多了:
main.cpp:
#include <iostream> #include <cstdio> #include "mydll.h" using namespace std; #pragma comment(lib, "mydll.lib") int main() { mymath m; cout<<"sum: "<<m.add(10, 1)<<endl; }
執行結果:
非常簡單!通過#pragma comment()宏將lib引入lib庫,可以像本地class一樣調用dll的class。