kowala's home

kowala's home
這裡是我的學習筆記,陸續增加中。
http://kowala21.blogspot.com

2012-06-15

wxDev C++ 開始製作 DLL

讓我們開始為她裝上翅膀,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

1 則留言:

  1. 我有廠商提供.h , .cpp, .lib的檔案,可是不知道該如何下手轉成dll檔

    回覆刪除

請提供您的寶貴意見 ;-)