調用dll中函數的兩種方法

第一種聲明函數爲導出函數(__declspec(dllexport))ios

 聲明一個導出函數,是說這個函數要從本DLL導出。若是你的DLL裏全是C++的類的話,你沒法在DEF(後邊講)裏指定導出的函數,只能用__declspec(dllexport)導出類windows

被extern "C"修飾的變量和函數是按照C語言方式編譯和鏈接的。C和C++對函數的處理方式是不一樣的.extern "C"是使C++可以調用C寫做的庫文件的一個手段,若是要對編譯器提示使用C的方式來處理函數的話,那麼就要使用extern "C"來講明。ide

例子以下:函數

建立一個dll新建一cpp填寫代碼以下便可編譯連接獲得一個dll測試

extern "C" __declspec(dllexport) int Add(int a,int b)指針

{文檔

       return a+b;     字符串

}        編譯器

再建立一win32控制檯程序新建一cpp (做爲測試程序)填寫代碼以下:it

#include <iostream.h>

#include <windows.h>

void main()

{

       HINSTANCE Hdll = GetModuleHandle("AddDll.dll");

       if (NULL == Hdll)

       {

              Hdll = LoadLibrary("AddDll.dll");

       }

       typedef int (*TESTDLL) (int a,int b); //定義函數指針接收咱須要的函數

       TESTDLL pAdd;

       pAdd =(TESTDLL)GetProcAddress(Hdll,"Add"); //獲得地址初始化咱的函數指針

       int c = pAdd(1,3);  //調用

       cout<<"c = "<<c<<endl;

FreeLibrary(Hdll);   //在恰當的時候釋放句柄。

}

編譯連接運行結果輸出c = 4

第二種方法.def文件(模塊定義文件) 是一個有.def擴展名的文本文件。它被用於導出一個DLL的函數,和__declspec(dllexport)很類似

*.DEF文件的編寫(是在dll文件中寫的不是測試工程中)

內容以下:

LIBRARY "xxx"

EXPROTS

myFunction1 @1

myFunction2 @2

前面兩行是固定格式

"xxx"是DLL名,不帶擴展名的

第三行四行是本身的函數名,後面的@後的數字是函數序號,不論編譯器將函數名改爲啥樣,但DLL根據序號來調用函數,

 例子以下:

 建立一個dll新建一cpp填寫代碼以下

int __stdcall Add(int a,int b)

{     

       return a+b;     

}

int __stdcall Sub(int a,int b)

{

       return a-b;

}

編寫def文件(vc6.0高級的編譯環境能夠直接添加def文件)

在此dll工程的根目錄下編寫便可在此須要新建一文本文檔改後綴名爲def便可內容以下

LIBRARY AddDll

EXPORTS

 

Add @ 1

Sub @ 2

寫好只好將其添加到咱dll的工程中 工程—增長到工程---文件選擇咱的def文件便可 編譯連接生成目標dll      

再建立一win32控制檯程序新建一cpp (做爲測試程序)填寫代碼以下:

#include <iostream.h>

#include <windows.h>

void main()

{

HINSTANCE Hdll = GetModuleHandle("AddDll.dll");

if (NULL == Hdll)

{

       Hdll = LoadLibrary("AddDll.dll");

}

typedef int (__stdcall *TESTDLL) (int a,int b); //定義函數指針接收咱須要的函數

TESTDLL pAdd;

pAdd =(TESTDLL)GetProcAddress(Hdll,MAKEINTRESOURCE(2));.//調用序號爲2的函數

//MAKEINTRESOURCE的做用:是把一個"數字形ID",轉化爲"字符串".

//可是執行先後,輸入的數據的內容和長度是不變的!它只不過就是C語言裏面"強制類型轉換"而已.

int c = pAdd(1,3);  //調用

cout<<"c = "<<c<<endl;

FreeLibrary(Hdll);

}

簡單的兩種方法。結合網上資料與百度。

相關文章
相關標籤/搜索