將 VC 窗體 EXE 轉換成 DLL,供其它語言調用

在網上也搜索了一番,但都太麻煩,或者不太實用。只好自己摸索了。終於搞定。記錄一下。

宗旨:
         一:儘量不修改原有 VC EXE 工程的源代碼;
         二:儘量具有通用性;

VC 的窗體有兩種:基於對話框(Dialog)的窗體基於 MFC 的窗體。下面分情況說明。

一:基於對話框(Dialog)的窗體
       基於對話框(Dialog)的窗體,因爲沒有封裝,所以程序的入口點是 WinMain。
       所以我們新建一個dll.cpp 文件,輸出函數 ShowDllForm,ShowDllForm 函數調用 WinMain,就可以了。
       不用修改原有工程的源代碼。
       將這個dll.cpp 編譯(只編譯,不連接),再和原有的 EXE 工程編譯出來的 OBJ、RES、庫文件,一起連接成 DLL 就可以了。
      

#include <windows.h>

HINSTANCE hinst = NULL;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
		hinst = (HINSTANCE)hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow);

extern "C" __declspec(dllexport) void ShowDllForm()
{
      WinMain(hinst, 0, (LPSTR)"", 1);
}

二:基於 MFC 的窗體
MFC 是經過微軟封裝的。和基於對話框的 EXE 有區別。
MFC EXE/DLL 程序的入口被封裝了,不在我們的工程代碼中。
而是調用我們工程中的  CxxxApp::InitInstance() 代碼。
因此從這個函數入手。
1、將 MFC EXE 工程修改爲 DLL 類型;
2、修改 CxxxApp::InitInstance 裏面的內容。因爲 DLL 一初始化,就會調用這裏的代碼。
      在行首(最前面),添加代碼:
      (g_bInit 爲新添加的 bool 類型變量。意思很明確,爲 false 時,不執行後面的代碼,直接返回了)

BOOL CxxxApp::InitInstance()
{
    if(!g_bInit)
	  return TRUE;

3、在此單元,CxxxApp::InitInstance 代碼上面,添加 DLL 輸出函數 ShowDllForm,再次調用 InitInstance() 函數:

BOOL g_bInit=FALSE;

extern "C" __declspec(dllexport) void ShowDllForm()
{
	g_bInit = TRUE;
	theApp.InitInstance();
}

  編譯,得到 DLL ,調用OK。

GOOD LUCK!

 

發佈了53 篇原創文章 · 獲贊 41 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章