現在最常看見的關於DLL的問題就是如何在DLL中使用對話框,這是一個很普遍的關於如何在DLL中使用資源的問題。這裡我們從Win32 DLL和MFC DLL兩個方面來分析並解決這個問題。
1.Win32 DLL
在Win32 DLL中使用對話框很簡單,你只需要在你的DLL中添加對話框資源,而且可以在對話框上面設置你所需要的控件。然後使用DialogBox或者CreateDialog這兩個函數(或相同作用的其它函數)來創建對話框,並定義你自己的對話框回調函數處理對話框收到的消息。下面通過一個具體實例來學習如何在Win32 DLL中使用對話框,可以按照以下步驟來完成這個例子:
1)在VC菜單中File->New新建一個命名為UseDlg的Win32 Dynamic-Link Library工程,下一步選擇A simple DLL project。
2)在VC菜單中Insert->Resource添加一個ID為IDD_DLG_SHOW的Dialog資源,將此Dialog上的Cancel按鈕去掉,僅保留OK按鈕。再添加一個ID為IDD_ABOUTBOX的對話框,其Caption為About。保存此資源,將資源文件命名為UseDlg.rc。並將resource.h和UseDlg.rc加入到工程裡面。
3)在UseDlg.app中包含resource.h,並添加如下代碼:
HINSTANCE hinst = NULL;
HWND hwndDLG = NULL;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam);
BOOL CALLBACK AboutProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) void ShowDlg();
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hinst = (HINSTANCE)hModule;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" __declspec(dllexport) void ShowDlg()
{
hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DLG_SHOW),
NULL,(DLGPROC)DlgProc);
ShowWindow(hwndDLG, SW_SHOW);
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if(LOWORD(wParam)==IDOK)
DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),
hDlg,(DLGPROC)AboutProc);
return TRUE;
case WM_CLOSE:
DestroyWindow(hDlg);
hwndDLG = NULL;
return TRUE;
}
return FALSE;
}
BOOL CALLBACK AboutProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
EndDialog(hDlg,NULL);
hwndDLG = NULL;
return TRUE;
}
return FALSE;
}
4)編譯生成UseDlg.dll和UseDlg.lib。
接下來我們建立調用此DLL的應用程序,其步驟如下:
1)在VC菜單中File->New新建一個命名為Use的MFC AppWizard(exe)工程,下一步選擇Dialog Based之後點擊Finish按鈕。
2)在主對話框上面添加一個按鈕,之後雙擊此按鈕,會彈出Add Member Function的對話框,直接點擊OK進入void CUseDlg::OnButton1()函數。並在此函數內添加一個函數調用:ShowDlg();。
3)緊跟在#include語句後面加上如下代碼:
extern "C" __declspec(dllexport) void ShowDlg();
#pragma comment(lib,"debug/UseDlg")
4)將上面UseDlg工程中生成的UseDlg.dll和UseDlg.lib兩個文件復制到Use工程的Debug目錄內。
5)編譯生成Use.exe。
運行Use.exe,點擊Button1按鈕,可以看到一個名稱為Dialog的非模態對話框彈出。點擊上面的按鈕,可以彈出模態對話框About。運行成功。
讓我們來回顧一下在Win32 DLL中使用對話框的過程。
在DLL中,我們定義了兩個對話框資源:IDD_DLG_SHOW和IDD_ABOUTBOX,並且導出了函數ShowDlg。在函數ShowDlg之中使用CreateDialog函數創建了非模態對話框IDD_DLG_SHOW,並指定了該對話框的回調函數DlgProc。在DlgProc之中處理了WM_INITDIALOG、WM_COMMAND和WM_CLOSE消息,以響應用戶對對話框所做的動作。在處理按鈕動作的時候,使用DialogBox函數創建IDD_ABOUTBOX這個模態對話框,指定其回調函數為AboutProc,並且在AboutProc中處理其相應消息。