+ -
当前位置:首页 → 问答吧 → 用CreateDialog创建窗口,程序挂死。

用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里面用一个按扭来调用 的。我找不出原因啊。请了解的人给我说一下,我阻塞了好几天了。谢谢。

作者: wl_tian_dao_chou_qin   发布时间: 2011-12-22

你要创建一个MFC DLL,
再就是如果你在导出接口中直接使用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本身的窗口也死了。那段代码加在哪??能说明白一点吗?我很菜,我真的很谢谢你了,我真的很郁闷 ,大神,万分的感谢,为这个问题,我郁闷 了好几天了,谢谢。

作者: wl_tian_dao_chou_qin   发布时间: 2011-12-22