DLL全稱Dynamic Link Library,是微軟定義的動態連接庫類型。動態連接庫的好處沒必要多說。那麼在windows下如何使用DLL呢?DLL的使用有2種方式:第一種稱之爲」顯式連接」,只需提供DLL文件和知曉函數名便可;第二種稱之爲「隱式連接」,須要提供lib,頭文件和dll,這種方式比較正規。首先,咱們來製做一個dll文件。ios
打開vs2010,選擇Win32 Console Application,填入工程名」mydll」,在接下來的Application Settings設置的時候,將Application type設置爲DLL,將Additional options設置爲Empty project。windows
分別建立mydllbase.h ,mydll.h和mydll.cpp文件。文件內容以下:函數
mydllbase.h:spa
#ifndef MYDLLBASE_H #define MYDLLBASE_H class mydllbase { public: virtual ~mydllbase(){}; virtual int add(int a, int b) = 0; }; #endif
mydll.h:code
#ifndef MYDLL_H #define MYDLL_H class __declspec( dllexport ) mymath: public mydllbase { public: mymath(){} int add(int a, int b); }; #endif
mydll.cpp:blog
#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.aspxget
http://msdn.microsoft.com/en-us/library/81h27t8c.aspxit
編譯後生成:io
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。