从DLL创建对话框

时间:2018-10-27 08:32:43

标签: c++ winapi dll win32gui

我需要从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不存在。

我尝试过的事情:

  1. EndDialog就在调用DialogBox之前
  2. 创建一个单独的项目并尝试这种情况(在这里可以正常工作)。
  3. 创建简单的while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));。 (失败)。

所有Exe都是控制台应用程序。不是win32项目。任何帮助将不胜感激。

0 个答案:

没有答案