用CreateDialog创建窗口,程序挂死。
时间:2011-12-22
来源:互联网
大体上是这样的,我用一个动态库,里面用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里面用一个按扭来调用 的。我找不出原因啊。请了解的人给我说一下,我阻塞了好几天了。谢谢。
作者: wl_tian_dao_chou_qin 发布时间: 2011-12-22
你要创建一个MFC DLL,
再就是如果你在导出接口中直接使用DLL中的资源,要切换模块状态的 AFX_MANAGE_STATE(AfxGetStaticModuleState());
再就是如果你在导出接口中直接使用DLL中的资源,要切换模块状态的 AFX_MANAGE_STATE(AfxGetStaticModuleState());
作者: fairyprince 发布时间: 2011-12-22
我这个dll,必须是动态库,所以不能用MFC的dll,我想知道,你的那句代码加在哪?
以下是我MFC的那个按扭的代码
void CTest_showwindowDlg::OnButton1()
{
// TODO: Add your control notification handler code here
ShowDlg();
}
//这个showdlg()就是那个dll里面导出的,运行之后,热键调出的窗口被本身的这个MFC给盖住了,而且也死了。再过一会,MFC本身的窗口也死了。那段代码加在哪??能说明白一点吗?我很菜,我真的很谢谢你了,我真的很郁闷 ,大神,万分的感谢,为这个问题,我郁闷 了好几天了,谢谢。
以下是我MFC的那个按扭的代码
void CTest_showwindowDlg::OnButton1()
{
// TODO: Add your control notification handler code here
ShowDlg();
}
//这个showdlg()就是那个dll里面导出的,运行之后,热键调出的窗口被本身的这个MFC给盖住了,而且也死了。再过一会,MFC本身的窗口也死了。那段代码加在哪??能说明白一点吗?我很菜,我真的很谢谢你了,我真的很郁闷 ,大神,万分的感谢,为这个问题,我郁闷 了好几天了,谢谢。
作者: wl_tian_dao_chou_qin 发布时间: 2011-12-22
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28