在一開始動手,我們使用Dev C++去開啟一個DLL的專案,而開啟的這個專案裡面就會有基本的Hello World DLL版本如下:
dll.h:
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif
DLLIMPORT void HelloWorld (void);
#endif
dllmain.c:
#include "dll.h"
#include < windows.h >
#include < stdio.h >
#include < stdlib.h >
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}
BOOL APIENTRY DllMain (HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
上面的程式碼即是屬於DLL的部份,當然我們要Build DLL出來就是為了要使用他,所以我們再實作一個測試這個DLL的程式
test.c:
#include < stdio.h >
#include < stdlib.h >
#include "windows.h"
int main()
{
HMODULE hInst;
void (*CallDll)(void);
hInst = LoadLibrary("testDLL.dll");
(FARPROC*)( CallDll)=GetProcAddress(hInst,"HelloWorld");
CallDll();
FreeLibrary(hInst);
return 0;
}
test.c主要就是先去將我們Build出來的DLL Load到Memory裡,再使用函數指標(CallDLL)去指向我們想要呼叫的函數(利用GetProcAddress),這樣就可以達到函數呼叫的功能,並且可以達到函式庫的動態載入
從以上的例子可以知道,如果想要新增一個函數在DLL裡的話,只需要在想要新增的函數前面加上一個DLLIMPORT的宣告即可。以一個整數相加的函數為例子:
DLLIMPORT int add(int x, int y)
{
return x+y;
}
HelloWorld的例子是一個沒有參數傳遞的例子,但是如果我們寫的函數是有參數的怎麼辦呢?我們只需要在函數指標(此例為CallDll)上做修改即可。以上面整數相加函數(add)為例子
#include
#include
//windows head file
#include "windows.h"
int main()
{
int result;
HMODULE hInst;
int (*CallDll)(int, int);
hInst = LoadLibrary("testDLL.dll");
(FARPROC*)(CallDll)=GetProcAddress(hInst,"add");
result = CallDll(2, 3);
printf("%d", result);
FreeLibrary(hInst);
return 0;
}
在宣告函數指標(CallDll)的地方,我們將它修改為回傳int並有兩個int參數,在GetProcAddress的地方我們指定函數名稱add,接著就像一般我們呼叫函數一樣。這樣就達到我們的目標了
Reference:
DEV-CPP中生成和使用DLL的方法
No comments:
Post a Comment