Создание DialogBox из DLL - PullRequest
       16

Создание DialogBox из DLL

0 голосов
/ 27 октября 2018

Мне нужно создать DialogBox из DLL (не используя MFC). DialogBox создается, но нигде не отображается в пользовательском интерфейсе. Его сообщение Loop запускается. он получает все сообщения, но не показывает !. Сценарий выглядит следующим образом.

Есть 2 Exe и DLL.

Процесс A : вызовы Процесс 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. Все работают как задумано. Цикл сообщений Диалога работает нормально. Он печатает журналы нормально, но фактическое диалоговое окно нигде не видно. Я на VS 2017. Нет кода возврата от DialogBox, так как он все еще ждет EndDialog, что невозможно, поскольку пользовательского интерфейса там нет.

Вещи, которые я пробовал:

  1. while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)); непосредственно перед вызовом DialogBox
  2. Создайте отдельный проект и опробуйте этот сценарий (он там работает).
  3. Создание простого MessageBox. (FAILS).

Все Exe являются консольными приложениями. Не win32 проекты. Любая помощь будет оценена.

...