Thursday, February 19, 2009

Dev C++ Dynamic-Link Library

因為朋友詢問如何利用Dev C++的環境去Build一個DLL出來,所以就開始動手試試看,也在Google上爬了一些文,有了一點點心得,以下是我測試出來的結果:

在一開始動手,我們使用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