首页 > 解决方案 > 从 DLL 创建对话框

问题描述

我需要从 DLL(不使用 MFC)创建一个对话框。已DialogBox创建但未在 UI 中的任何位置显示。它的消息循环运行。它接收所有消息,但不显示!情景如下。

有2个Exe和一个DLL。

Process A :使用with flags调用Process B。CreateProcessCREATE_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 不存在。

我尝试过的事情:

  1. while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));就在调用 DialogBox 之前
  2. 创建一个单独的项目并尝试这个场景(它在那里工作)。
  3. 创建一个简单的MessageBox. (失败)。

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

标签: c++winapidllwin32gui

解决方案


推荐阅读