c++ - 从 DLL 创建对话框
问题描述
我需要从 DLL(不使用 MFC)创建一个对话框。已DialogBox
创建但未在 UI 中的任何位置显示。它的消息循环运行。它接收所有消息,但不显示!情景如下。
有2个Exe和一个DLL。
Process A :使用with flags调用Process B。CreateProcess
CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW |CREATE_UNICODE_ENVIRONMENT
进程 B:使用 DLL 加载LoadLibrary
并调用将调用DialogBox
.
对话框的资源文件如下
IDD_MSGHLDR DIALOGEX 0, 0, 276, 83
STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_NOFAILCREATE | DS_CENTER | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_OVERLAPPEDWINDOW | WS_EX_NOPARENTNOTIFY | WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_APPWINDOW
CAPTION "Notification"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",ID_INSTALL_OK,164,62,50,14
PUSHBUTTON "Cancel",ID_INSTALL_CANCEL,219,62,50,14
EDITTEXT IDC_MSG,7,7,262,40,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_MSG_TIMEOUT,7,59,145,17,ES_READONLY | NOT WS_BORDER
END
/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//
IDD_MSGHLDR AFX_DIALOG_LAYOUT
BEGIN
0,
0, 0, 100, 100,
0, 0, 0, 0,
0, 0, 100, 100,
0, 0, 0, 0
END
DialogBox
是使用创建的
DialogBox(currentDLLInstance, MAKEINTRESOURCE(IDD_MSGHLDR), NULL,DialogProc);
DialogProc函数如下。
INT_PTR CALLBACK DriverDialogProc(_In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
hCurrentMessageHandler = hwndDlg;
//(SetDlgItemText(hwndDlg, IDC_MSG, messageToDisplay.c_str())) ? PrintLog("\t[DRV_MSG_HANDLER] => Setting Message %s SUCCESS", messageToDisplay.c_str()) : PrintLog("\t[DRV_MSG_HANDLER] => Setting Message %s FAILED", messageToDisplay.c_str());
if (applicationCode == ApplicationCode::PMP)
SetWindowText(hwndDlg, (LPCSTR)PMP_TEXT);
else
SetWindowText(hwndDlg, (LPCSTR)DC_TEXT);
//SetTimer(hwndDlg, 0, 1000, (TIMERPROC)CountDown);
//ShowWindow(hwndDlg, SW_SHOW);
return FALSE;
case WM_SETTEXT:
PrintLog("\t[DRV_MSG_HANDLER] => Setting Title : %s", (LPCSTR)lParam);
return FALSE;
case WM_COMMAND:
PrintLog("\t[DRV_MSG_HANDLER] => Rcvd WM_COMMAND WITH Wparam H : %d , L : %d", HIWORD(wParam), LOWORD(lParam));
switch (LOWORD(wParam))
{
case ID_INSTALL_OK:
PrintLog("\t[DRV_MSG_HANDLER] => User clicked OK");
EndDialog(hwndDlg, PROCEED);
return TRUE;
case ID_INSTALL_CANCEL:
PrintLog("\t[DRV_MSG_HANDLER] => User clicked Cancel");
EndDialog(hwndDlg, SKIP);
return TRUE;
}
return TRUE;
}
return FALSE;
}
我对进程或 DLL 都没有问题。所有工作都按预期工作。对话框的消息循环运行良好。它可以很好地打印 LOGS,但实际对话框在任何地方都不可见。我在 VS 2017 上。没有返回代码,DialogBox
因为它仍在等待,EndDialog
这是不可能的,因为 UI 不存在。
我尝试过的事情:
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));
就在调用 DialogBox 之前- 创建一个单独的项目并尝试这个场景(它在那里工作)。
- 创建一个简单的
MessageBox
. (失败)。
所有的 Exe 都是控制台应用程序。不是win32项目。任何帮助,将不胜感激。
解决方案
推荐阅读
- python-3.x - 让一个类的每个实例都知道另一个类的一个特定实例的最佳方法是什么?
- javascript - 错误:UnhandledPromiseRejectionWarning:未处理的承诺拒绝
- jquery - 在 Droppable 上拖动可排序项目 A 并显示可排序项目的“over”事件后,这些项目在放置 A 之前无法排序
- parsing - 可以用 yacc 解析的语言类别是什么?
- scala - 将基于相对计数的资格标准应用于 Scala 中的 Spark 数据帧的有效方法是什么?
- javascript - 通过修改图像 url 使用 javascript 响应图像;无图片标签
- lldb - 如何在 lldb 中打印一系列 std::vector 元素?
- r - 计算while循环执行的次数,直到它被放置在for循环中(相同的输出一遍又一遍地重复)
- performance - 与其他系统编程语言(如 C)中通常使用的函数相比,Rust 风格的方法调用方法是否有任何开销?
- module - 在 Rust 测试中使用未声明的类型或模块,但我导入了它