讓我們開始為她裝上翅膀,wxDev C++ 也可以很簡單的製作 DLL,什麼是 DLL,簡單的說,就是動態連結程式庫 (Dynamic Link Library, DLL) 是具有函式的共用程式庫功能的可執行檔[1]。
承接上例 Dev C++ psapi.h 使用方法,我們把它轉成 DLL。
先開一個 DLL 專案,命名為 getDD,然後在 getDD.h 及 getDD.cpp 檔,加入以下內容。
/***************
getDD.h
****************/
#if BUILDING_DLL
# define MY_DECLSPEC __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define MY_DECLSPEC __declspec (dllimport)
#endif /* Not BUILDING_DLL */
extern "C"{
MY_DECLSPEC void showDll(char str[]);
MY_DECLSPEC void showAllDll();
}
typedef void (*sDll)(char*);
typedef void (*aDll)();
/***************
getDD.cpp
****************/
#include "getDD.h"
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
MODULEINFO mi = {0};
void showDll(char str[]){
printf("XD %s\n",str);
GetModuleInformation(GetCurrentProcess(),GetModuleHandle(str),&mi,sizeof(mi));
printf("(1) %s is 0x%p\n",str,mi.lpBaseOfDll);
printf("(2) %s is 0x%p\n",str,GetModuleHandle(str));
}
void showAllDll(){
printf("XD All...\n");
GetModuleInformation(GetCurrentProcess(),GetModuleHandle("psapi.dll"),&mi,sizeof(mi));
printf("(1) psapi.dll is 0x%p\n",mi.lpBaseOfDll);
printf("(2) psapi.dll is 0x%p\n",GetModuleHandle("psapi.dll"));
}
打好之後,必須在 Project > Project options > Parameters 加上引用 lib
-lpsapi
再按下編譯,它會產生一個 getDD.a 及 getDD.dll 檔。
接著再開一個 C++ Console 專案來測試,命名為 getDDTest 內容如下。
/***************
getDDTest.cpp
****************/
#include <windows.h>
#include "getDD.h"
using namespace std;
int main(int argc, char *argv[]){
HMODULE hInst = LoadLibrary("getDD.dll");
sDll sd=(sDll)GetProcAddress(hInst,"showDll");
aDll ad=(aDll)GetProcAddress(hInst,"showAllDll");
sd("kernel32.dll");
ad();
FreeLibrary(hInst);
system("pause");
return EXIT_SUCCESS;
}
執行畫面如下
這裡示範動態載入 DLL 執行,也就是說,它是在 RUNTIME 才載入的,
這裡使用 LoadLibrary 載入 DLL,FreeLibrary 釋放 DLL。
LoadLibrary("getDD.dll");
FreeLibrary(hInst);
結束時要記得釋放,LoadLibrary 與 FreeLibrary 是成對出現的,這點寫程式時要注意。
編譯時,要先含入 DLL 資訊檔 libgetDD.a ,可以用她的 Add 按鈕來加入,以避免打錯字。
這樣一共會產生3個檔,但是發佈時,只需要 exe 及 dll 檔就可以執行了。
Reference
[1].http://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93
[2].http://www.mingw.org/wiki/sampleDLL
我有廠商提供.h , .cpp, .lib的檔案,可是不知道該如何下手轉成dll檔
回覆刪除