Win32 PrintDlg, PrintDlgEx, сбои и причуды - PullRequest
3 голосов
/ 09 июня 2011

Мне поручено решить следующую проблему: мое приложение аварийно завершает работу при запуске на 64-разрядной машине, когда вызывается функция PrintDlg () .

После рытья и выдергивания волос я решил, что лучшее решение - заменить исходные вызовы PrintDlg () его старшим братом, PrintDlgEx () .

Это исправляет одну проблему (она больше не падает!), Но вызывает другую. Когда я выполняю код, это , а не , показывающий диалог печати, просто возвращающий код успеха и выдающий мне всю информацию для моего принтера по умолчанию. Мне нужна эта функция, чтобы показать стандартное окно «Настройка печати», я не знаю, как это сделать. Ниже показаны примеры значений, которые я пытаюсь использовать для отображения моего диалога.

Есть мысли? Заранее спасибо.

//  Initialize the PRINTDLGEX structure.
pd2.lStructSize = sizeof(PRINTDLGEX);
pd2.hwndOwner = wnddata->wnd.hnd;
pd2.hDevMode = NULL;
pd2.hDevNames = NULL;
pd2.hDC = NULL;
pd2.Flags = PD_RETURNDC | PD_COLLATE;
pd2.Flags2 = 0;
pd2.ExclusionFlags = 0;
pd2.nPageRanges = 0;
pd2.nMaxPageRanges = 10;
pd2.lpPageRanges = NULL;
pd2.nMinPage = 1;
pd2.nMaxPage = 1000;
pd2.nCopies = 1;
pd2.hInstance = 0;
pd2.lpPrintTemplateName = NULL;
pd2.lpCallback = NULL;
pd2.nPropertyPages = 0;
pd2.lphPropertyPages = NULL;
pd2.nStartPage = START_PAGE_GENERAL;
pd2.dwResultAction = 0;
pdrc = PrintDlgEx  (&pd2);

1 Ответ

5 голосов
/ 09 июня 2011

Скорее всего, вы получаете код возврата E_INVALIDARG из-за невозможности прочитать мелкий шрифт в структуре PRINTDLGEX . В частности, он говорит: «Если флаг PD_NOPAGENUMS не указан, lpPageRanges должен быть ненулевым.»

Основная проблема с PrintDlg / PrintDlgEx связана с отсутствующим атрибутом в вашем WinMain. Вам нужно пометить WinMain как [STAThreadAttribute], чтобы указать, что ваша модель COM-потока является однопоточным. Могут работать и другие модели потоков, но точно сказать не могу.

...