1. 程式人生 > >Win32 動態連結(dll)簡單示例

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那一列則是編譯之後函式的名字,比之前的函式名多了些字首字尾.