Мне нужно создать 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
, что невозможно, поскольку пользовательского интерфейса там нет.
Вещи, которые я пробовал:
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));
непосредственно перед вызовом DialogBox
- Создайте отдельный проект и опробуйте этот сценарий (он там работает).
- Создание простого
MessageBox
. (FAILS).
Все Exe являются консольными приложениями. Не win32 проекты. Любая помощь будет оценена.