PrintDlgEx недопустимый аргумент, в то время как PrintDlg работает

Проблема: мне нужно, чтобы PrintDlgEx работал для моего проекта, но никакая комбинация опций или аргументов не работает для меня. Это дает E_INVALIDARG для любых комбинаций параметров, таких как те, которые я скопировал из образцов Microsoft или других онлайн-образцов.

Замена PRINTDLGEX на PRINTDLG и PrintDlgEx на PrintDlg (и исключение группы опций только из PRINTDLGEX) работает нормально.

К сожалению, мне нужно PrintDlgEx, потому что мне действительно нужна кнопка Apply, чтобы изменить принтеры или страницу свойств без печати, для дизайна и предварительного просмотра.

Пожалуйста, помогите мне найти, почему я не могу отобразить диалоговое окно.

Код: в то время как я упростил части, например, что должно произойти при успешном возврате или установке DEVMODE и DEVNAMES, я попробовал именно эту функцию с тем же результатом: Неверный аргумент.

#include <QDebug>
#include <QWindow>
#include <windows.h>
void showPrintDialog()
{
    // Simplifying the setup: real code passes in a QWidget *
    QWidget *caller = this;
    // Not returning a value or doing any work. I just want the dialog to pop up for now

    // Create the standard windows print dialog
    PRINTDLGEX printDialog;
    memset(&printDialog, 0, sizeof(PRINTDLGEX));
    printDialog.lStructSize = sizeof(PRINTDLGEX);

    printDialog.Flags = PD_RETURNDC |           // Return a printer device context. Without this, HDC may be undefined
                        PD_USEDEVMODECOPIESANDCOLLATE |
                        PD_NOSELECTION |        // Don't allow selecting individual document pages to print
                        PD_NOPAGENUMS |         // Disables some boxes
                        PD_NOCURRENTPAGE |      // Disables some boxes
                        PD_NONETWORKBUTTON |    // Don't allow networking  (but it show "Find printer") so what does this do ?
                        PD_HIDEPRINTTOFILE;     // Don't allow print to file

    // Only on PRINTDLGEX
        // Theis block copied from https://learn.microsoft.com/en-us/windows/win32/dlgbox/using-common-dialog-boxes?redirectedfrom=MSDN
        // I have tried multiple combinations of options, including none, I really don't want any of them
        printDialog.nStartPage = START_PAGE_GENERAL;
        printDialog.nPageRanges = 1;
        printDialog.nMaxPageRanges = 10;
        LPPRINTPAGERANGE pageRange = (LPPRINTPAGERANGE) GlobalAlloc(GPTR, 10 * sizeof(PRINTPAGERANGE));
        printDialog.lpPageRanges = pageRange;
        printDialog.lpPageRanges[0].nFromPage = 1;
        printDialog.lpPageRanges[0].nToPage = 1;
        printDialog.Flags2 = 0;
        printDialog.ExclusionFlags = 0;
        printDialog.dwResultAction = 0; // This will tell me if PRINT

        // Rest of options are also on PRINTDLG
        printDialog.nMinPage = 1;
        printDialog.nMaxPage = 10;

    // The only options I really need
    printDialog.nCopies = 1;
    printDialog.hDevMode = Q_NULLPTR;   // which will be better once this works
    printDialog.hDevNames = Q_NULLPTR;   // which will be better once this works
    printDialog.hwndOwner = reinterpret_cast<HWND>(caller->windowHandle()->winId());

    // Calling...
    int result = PrintDlgEx(&printDialog);
    qDebug() << (result == E_INVALIDARG ? "Invalid Argument\n" : "Success\n");

    // It always is E_INVALIDARG

    // Cleanup
    if (printDialog.hDevMode)
       GlobalFree(printDialog.hDevMode);
    if (printDialog.hDevNames)
       GlobalFree(printDialog.hDevNames);
    if (printDialog.hDC)
       DeleteDC(printDialog.hDC);
}

Платформа: Windows 10, последнее обновление;
Версия Qt: 5.12.7 или выше (так как в ВМ у меня 5.15.1)
Тот факт, что я работаю в Qt, не имеет значения, так как это все WIN API, помимо версии c++ (11)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу заставить ваш пример работать, если я удалю флаг PD_NONETWORKBUTTON.

Обратите внимание, что хотя он задокументирован для структуры PRINTDLGA , он НЕ указан в PRINTDLGEXA

ПРИМЕЧАНИЕ. Я получил ту же ошибку с этим флагом.

Другие вопросы по теме