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

解决方案 »

  1.   

    你要创建一个MFC DLL,
    再就是如果你在导出接口中直接使用DLL中的资源,要切换模块状态的 AFX_MANAGE_STATE(AfxGetStaticModuleState());
      

  2.   

    我这个dll,必须是动态库,所以不能用MFC的dll,我想知道,你的那句代码加在哪?
    以下是我MFC的那个按扭的代码
    void CTest_showwindowDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    ShowDlg();

    }
    //这个showdlg()就是那个dll里面导出的,运行之后,热键调出的窗口被本身的这个MFC给盖住了,而且也死了。再过一会,MFC本身的窗口也死了。那段代码加在哪??能说明白一点吗?我很菜,我真的很谢谢你了,我真的很郁闷 ,大神,万分的感谢,为这个问题,我郁闷 了好几天了,谢谢。
      

  3.   

    extern "C" __declspec(dllexport) void ShowDlg() //用来导出给外面调用
    {
    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); 隐藏对话框}
      

  4.   

    这个dll,是动态库 win32 dynamic~link library  这句话放那编译器报错啊。说宏和函数都没有定义,怎么办。
      

  5.   

    如果你不用MFC 就要自已在消息循环中调用 IsDialogMessage还有一个办法,用CreateWindow 创建窗口,并自已注册一窗口类
      

  6.   

    我这里采用的是引入对话框模板,自己画太难了,而且界面要求好看,并且上面还有一些控件需要处理消息等功能,这是项目组里要求的,没有办法,只能引入模板了,然后用createdialog()来创建模板框,里面还有其他操作,所以你提的这二种方法对于我要实现的操作起来很复杂。