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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/embededvc/article/details/7183764

近日,开发一个项目,需要在资源管理器中双击某个文件类型,会显示对这个文件进行处理的对话框,对话框需要显示成非模式,这样可以不影响在资源管理器中可以进行其它操作,在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不能被释放。

展开阅读全文

关于DLL显示模式对话框问题

10-30

我首先建立了一个以对话框为基础的应用程序,我需要根据要求调用DLL中的对话框,但我希望在DLL中的对话框为非模式对话框,然后动态调用DLLrn如下:rnextern "C" __declspec( dllexport ) void MyDllTest()rnrn AFX_MANAGE_STATE(AfxGetStaticModuleState());rn CDllDlg *dlg = new CDllDlg;rn dlg->Create(IDD_DLG);rn dlg->ShowWindow(SW_SHOW);rnrnrn然后动态调用DLL,程序运行出错rn后来我在主程序中添加一个CWinThread线程类然后在线程中启动DLL,而这时候我在DLL中如下作:rnBEGIN_MESSAGE_MAP(CMchdllApp, CWinApp)rnEND_MESSAGE_MAP()rnrnrn// CMchdllApp 构造rnrnCMchdllApp::CMchdllApp()rnrn // TODO: 在此处添加构造代码,rn // 将所有重要的初始化放置在 InitInstance 中rnrnrnrn// 唯一的一个 CMchdllApp 对象rnrnCMchdllApp theApp;rnrnrn// CMchdllApp 初始化rnrnBOOL CMchdllApp::InitInstance()rnrn CWinApp::InitInstance();rn CDllDlg dlg;rn dlg.DoModal();rnrn return TRUE;rnrnrnextern "C" __declspec( dllexport ) HWND MyDllTest()rnrn AFX_MANAGE_STATE(AfxGetStaticModuleState());rn return(theApp.m_pMainWnd->GetSafeHwnd());rn rnrn这样作,相当于另外启动一个程序吧?但是两个对话框切换时仍然有些不正常的现象rn请问高手们,有没有更好的方法在DLL中显示对话框,而且可以同时操作主程序对话框和DLL对话框,并且两个对话框之间可以通讯.rn如果我这种方法也可以成功的话请问,我缺少了什么东西,我该注意什么?rn 论坛

我的模式对话框不能正常显示

11-15

[code=c]// ag.cpp : 定义应用程序的入口点。rn//rnrn#include "stdafx.h"rn#include "ag.h"rnrn#define MAX_LOADSTRING 100rnrn// 全局变量:rnHINSTANCE hInst; // 当前实例rnTCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本rnTCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名rnHWND hDialog; //窗口rnrnrnrnINT_PTR CALLBACK DialogProc(rn _In_ HWND hwndDlg,rn _In_ UINT uMsg,rn _In_ WPARAM wParam,rn _In_ LPARAM lParamrn );rnrnrnint APIENTRY _tWinMain(HINSTANCE hInstance,rn HINSTANCE hPrevInstance,rn LPTSTR lpCmdLine,rn int nCmdShow)rnrn rn // TODO: 在此放置代码。rn MSG msg;rn HACCEL hAccelTable;rnrn // 初始化全局字符串rn LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);rn LoadString(hInstance, IDC_AG, szWindowClass, MAX_LOADSTRING);rn rnrn hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AG));rnrn hDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);rnrn ShowWindow(hDialog,SW_SHOW);rnrn UpdateWindow(hDialog);rnrn // 主消息循环:rn while (GetMessage(&msg, NULL, 0, 0))rn rn if (!hInstance || !IsDialogMessage(hDialog,&msg) )rn rn if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))rn rn TranslateMessage(&msg);rn DispatchMessage(&msg);rn rn rn rnrn return (int) msg.wParam;rnrnrnrnrnrnrnrnINT_PTR CALLBACK DialogProc(rn _In_ HWND hwndDlg,rn _In_ UINT uMsg,rn _In_ WPARAM wParam,rn _In_ LPARAM lParamrn )rnrn rn switch(uMsg)rn rn case WM_COMMAND:rnrn if( (LOWORD(lParam)==IDOK) || (LOWORD(lParam)==IDCANCEL) )rn rnrn DestroyWindow(hwndDlg);rn return TRUE;rn rnrn break;rnrn default:rn return FALSE;rn rn return FALSE;rnrnrnrnrn[/code]rnrn任务栏倒是出现了这个对话框,但是并没有像弹出来。rnrn必须去任务栏哪里点击,才显示。说白了,就是程序后,这个对话框处于最小化状态中。rnrn为什么啊。rnrnrn对话框风格状体,我是采用默认的, 没有修改过的。rnrnrn 论坛

没有更多推荐了,返回首页