大体上是这样的,我用一个动态库,里面用CreateDialog创建一个窗口,但是不显示,同进注册一个热键用来显示这个窗口的,这个dll,我导出一个showdl(),我现创建一个MFC工程,在里面加一个按扭来调用showdlg(),可问题是,一点这个按扭,再启动热键,窗口出来了可是只在任务栏里显示有,同时程序死了(这段代码 VC2008上面可以用,但是在6.0上面不能),具体代码如下下:
dll的代码:
#include "stdafx.h"
#include "stdlib.h"#include "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_DIALOG1),NULL,(DLGPROC)DlgProc); //创建对话框
::RegisterHotKey(hwndDLG, 0xc111, MOD_ALT, 'A'); 注册alt+A为热键
ShowWindow(hwndDLG, SW_HIDE); 隐藏对话框
}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_DIALOG2),
hDlg,(DLGPROC)AboutProc);
return TRUE;
case WM_CLOSE:
DestroyWindow(hDlg);
hwndDLG = NULL;
return TRUE; case WM_HOTKEY:
{
if ( 0xc111 == wParam ) //热键消息下面来显示之前隐藏的那个窗口。
{
ShowWindow(hwndDLG, SW_SHOW);
// MessageBox(NULL, "ee", "ee", MB_OK);
}
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;
}在调用dll,里面的showdlg()是在MFC里面用一个按扭来调用 的。我找不出原因啊。请了解的人给我说一下,我阻塞了好几天了。谢谢。
dll的代码:
#include "stdafx.h"
#include "stdlib.h"#include "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_DIALOG1),NULL,(DLGPROC)DlgProc); //创建对话框
::RegisterHotKey(hwndDLG, 0xc111, MOD_ALT, 'A'); 注册alt+A为热键
ShowWindow(hwndDLG, SW_HIDE); 隐藏对话框
}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_DIALOG2),
hDlg,(DLGPROC)AboutProc);
return TRUE;
case WM_CLOSE:
DestroyWindow(hDlg);
hwndDLG = NULL;
return TRUE; case WM_HOTKEY:
{
if ( 0xc111 == wParam ) //热键消息下面来显示之前隐藏的那个窗口。
{
ShowWindow(hwndDLG, SW_SHOW);
// MessageBox(NULL, "ee", "ee", MB_OK);
}
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;
}在调用dll,里面的showdlg()是在MFC里面用一个按扭来调用 的。我找不出原因啊。请了解的人给我说一下,我阻塞了好几天了。谢谢。
再就是如果你在导出接口中直接使用DLL中的资源,要切换模块状态的 AFX_MANAGE_STATE(AfxGetStaticModuleState());
以下是我MFC的那个按扭的代码
void CTest_showwindowDlg::OnButton1()
{
// TODO: Add your control notification handler code here
ShowDlg();
}
//这个showdlg()就是那个dll里面导出的,运行之后,热键调出的窗口被本身的这个MFC给盖住了,而且也死了。再过一会,MFC本身的窗口也死了。那段代码加在哪??能说明白一点吗?我很菜,我真的很谢谢你了,我真的很郁闷 ,大神,万分的感谢,为这个问题,我郁闷 了好几天了,谢谢。
{
AFX_MANAGE_STATE(AfxGetStaticModuleState);
hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc); //创建对话框
::RegisterHotKey(hwndDLG, 0xc111, MOD_ALT, 'A'); 注册alt+A为热键
ShowWindow(hwndDLG, SW_HIDE); 隐藏对话框}