在網上也搜索了一番,但都太麻煩,或者不太實用。只好自己摸索了。終於搞定。記錄一下。
宗旨:
一:儘量不修改原有 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!