我需要从DLL(不使用MFC)创建对话框。 DialogBox
已创建,但未在UI中的任何位置显示。它的消息循环运行。它接收所有消息,但不显示!方案如下。
有2个Exe和一个DLL。
进程A :使用带有标志CreateProcess
的{{1}}调用进程B 。
进程B :使用CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW |CREATE_UNICODE_ENVIRONMENT
加载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
和DialogProc函数如下。
DialogBox(currentDLLInstance, MAKEINTRESOURCE(IDD_MSGHLDR), NULL,DialogProc);
我对进程或DLL都没有问题。所有工作均按预期进行。
对话框的消息循环运行正常。它将LOGS正常打印,但是“实际”对话框在任何地方都不可见。我正在使用VS 2017。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;
}
没有返回代码,因为它仍在等待DialogBox
,这是不可能的,因为UI不存在。
我尝试过的事情:
EndDialog
就在调用DialogBox之前while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));
。 (失败)。所有Exe都是控制台应用程序。不是win32项目。任何帮助将不胜感激。