Win32 PrintDlg,PrintDlgEx,Crashing和quirkiness

时间:2011-06-09 17:48:24

标签: c winapi printing win32com printdialog

我的任务是解决以下问题:当调用PrintDlg()函数时,我的应用程序在64位机器上运行时崩溃。

在挖掘和拔毛之后,我决定最好的解决方案是用更大的兄弟PrintDlgEx()替换PrintDlg()的原始调用。

这样做可以解决一个问题(它不再崩溃!),但会导致另一个问题。当我执行代码时,显示打印对话框,只返回成功代码,并为我提供默认打印机的所有信息。我需要这个功能来显示标准的“打印设置”窗口,我不知道如何实现它。下面显示的是我试图用来显示对话框的示例值。

有什么想法?提前谢谢。

//  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 个答案:

答案 0 :(得分:5)

由于未能阅读PRINTDLGEX结构上的细则,您最有可能获得E_INVALIDARG的返回码。具体来说,它说“如果未指定PD_NOPAGENUMS标志,则lpPageRanges必须为非NULL。”

PrintDlg / PrintDlgEx的根本问题是由于WinMain上缺少属性。您需要将WinMain标记为[STAThreadAttribute]以指示您的COM线程模型是单线程单元。其他线程模型可以工作,但我不能肯定地说。