DLL中创建的非模式对话框不能正常显示原因的解决

miscellaneous 专栏收录该内容
108 篇文章 0 订阅

近日,开发一个项目,需要在资源管理器中双击某个文件类型,会显示对这个文件进行处理的对话框,对话框需要显示成非模式,这样可以不影响在资源管理器中可以进行其它操作,在HKEY_CLASSES_ROOT中的shell\open\command中用rundll32.exe设置好对应需要调用的动态库函数后,发现在双击文件时,非模式对话框一闪而过,经过对rundll32.exe原理的了解,得知"Rundll32使用LoadLibrary来载入这个指定的DLL,使用GetProcAddress函数来获取函数地址,然后带着这个指定的参数(如果有这个参数的话)去调用函数。当这个函数返回时,Rundll32将卸载这个DLL并退出。"我的这个dll使用VC6.0的向导生成的,由于函数执行完后,动态库所对应的CWinApp实例也得到了释放(CWinApp::ExitInstance()被调用,WM_QUIT被发送给该实例的所有窗口),因此非模式对话框会一闪而过,解决该问题的主要途径是加上消息循环。等对话框关闭后,被调用的动态库函数返回,此时CWinApp::ExitInstance()才被系统被调用。代码如下所示:extern "C" __declspec(dllexport) void Hello( HWND hwnd,// handle to owner window HINSTANCE hinst, // instance handle for the DLL LPTSTR lpCmdLine, // string the DLL will parse int nCmdShow // show state ){if ( strlen(lpCmdLine) == 0 ) return;CMyDlg *mydlg = NULL; mydlg = new CMyDlg;if (mydlg){ mydlg->Create(IDD_DIALOG_MY); mydlg->ShowWindow(SW_SHOW); MSG msg; while (GetMessage(&msg, mydlg->m_hWnd, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); }}} 另外在对话框退出时,需要调用PostQuitMessage(0),以使消息循环结束退出,否则DLL不能被释放。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值