Win32 動態連結(dll)簡單示例
dll(dynamic link library)動態連結庫相當於是把一些函式或者類啊編譯成原始碼.不過它不可執行.只是當被其他exe或dll呼叫到時才被載入到記憶體中.像windows那些API都是放到一些dll檔案中.比如kernel32.dll,它包含管理記憶體,程序,執行緒的一些函式.User32.dll包含用於執行使用者介面任務的函式.
而當我們寫程式碼要用到dll中的函式時,在編譯階段一般只要個lib檔案,裡面有dll中的函式和類的描述資訊,但沒有實現程式碼資訊.
DLL的建立
下面來看一個建立dll的簡單示例
建立 Win32 Project-->application type選DLL.
project名字就取DllTest.建立好專案後我們會看到自動生成了.dllmain.cpp和DllTest.cpp,前一個檔案不用去動它.
我們就在DllTest.cpp檔案中新增如下內容
_declspec(dllexport)
int multiply(int one , int two) //返回兩數相乘的積
{
return one*two;
}
編譯下這個專案.你會在目錄下面看到DllTest.dll 和 DllTest.lib 這兩檔案.等會其他專案中要用它倆.
DLL的使用
新建一個簡單的Win32 console application 專案.把上面的DllTest.dll和DllTest.lib兩檔案拷到專案目錄下
#include <iostream>
using namespace std;
#pragma comment(lib, "./DllTest.lib")
int multiply( int one , int two) ; //函式宣告,函式定義最終是去呼叫DllTest.dll中的程式碼了.
//另外最好是寫成這樣_declspec(dllimport) int multiply( int one , int two)
int main()
{
int ret = multiply( 4,5);
cout<<ret; //20
return 0;
}
當然了,如果你嫌#pragma comment(lib, "./DllTest.lib")這樣寫麻煩,也不不寫,而是在專案的property page -->Linker -->Input -->Additional Dependencies裡面敲入DllTest.lib
Dll建立示例2(帶類的dll)
上面是比較簡單的再來看個複雜點的.
跟前面一樣還是一樣先建立一個win32 dll專案名為DllTest.然後新增class Arwen.
/////Arwen.h中內容/////////////////
#pragma once
#include <iostream>
#define DLL_API _declspec(dllimport)
class DLL_API Arwen{
public:
int age;
void Fun();
};
//////////Arwen.cpp中內容/////////////////
#include "StdAfx.h"
#include "Arwen.h"
#define DLL_API _declspec(dllexport)
void Arwen::Fun()
{
std::cout<<"my age is "<<age;
}
使用DLL
新建一個win32 console application ,把DllTest.dll和Dll.lib拷貝過去.另外把標頭檔案Arwen.h也拷過去.
#include "Arwen.h"
#pragma comment(lib, "./DllTest.lib")
int main()
{
Arwen an;
an.age = 25;
an.Fun();
return 0;
}
動態載入DLL
前面講的是靜態載入DLL,現在瞧下怎麼動態載入.
#include <windows.h>
typedef int( *pFun) (int a, int b); //定義一個函式指標型別
void main()
{
HINSTANCE hInt = LoalLibrary( _T( "../debug/DllTest.dll") ); //動態載入
pFun mulitplyFun = (pFun) GetProcAddress( hInt , (LPCSTR) MAKEINTRESOURCE(2)); //函式序列號是通過工具dumpbin查到的
}
工具dumpbin的使用.
1.先找到vsvar32.bat檔案,目錄是在: 安裝目錄\VC\bin\vcvars32.bat.然後在cmd裡面執行它
2.先切換到dll檔案所在目錄,假如這裡是DllTest.dll,然後執行命令dumpbin - exports DllTest.dll
3.得到所以匯出函式資訊,其中ordianl那一列指函式序列號 , name那一列則是編譯之後函式的名字,比之前的函式名多了些字首字尾.