C Win32 PrintDlg、PrintDlgEx、崩溃和怪癖

C Win32 PrintDlg、PrintDlgEx、崩溃和怪癖,c,winapi,printing,win32com,printdialog,C,Winapi,Printing,Win32com,Printdialog,我的任务是解决以下问题:当调用函数时,我的应用程序在64位机器上运行时崩溃 在挖掘和梳理之后,我决定最好的解决方案是将PrintDlg()的原始调用替换为它的大兄弟 这样做可以修复一个问题(不再崩溃!),但会导致另一个问题。执行代码时,不显示打印对话框,只返回一个成功代码,并提供默认打印机的所有信息。我需要这个功能来显示标准的“打印设置”窗口,我不知道该怎么做。下面是我试图用来显示对话框的示例值 有什么想法吗?提前谢谢 // Initialize the PRINTDLGEX structur

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

在挖掘和梳理之后,我决定最好的解决方案是将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);

您很可能会收到E_INVALIDARG的返回码,这是由于未能阅读结构上的精细打印。具体来说,它说“如果没有指定PD_NOPAGENUMS标志,lpPageRanges必须为非NULL。”


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

PrintDlgEx的返回值是多少?它是负值,我正在测试一种解决方法;如果它不起作用,我会把代码放回去,得到确切的数字。负HRESULT返回代码是失败的,而不是成功的。为什么不修复对PrintDlg的调用?对PrintDlg的调用永远都是相同的代码。在我的64位机器上,当你调用它时,它只是seg故障(这是新的,我们“相信”根本原因是我们的应用程序有一个不同的入口点,这是由于一些随机原因而对打印造成的影响)。在查看了PrintDlg的文档后,它说“使用PrintDlgEx…它更好”。使用PrintDlgEx现在确实没有崩溃,这是一个很大的改进。我只是想知道如何在对话中显示我希望我能再投1000次。我只是在他们的页面上添加了PD_NOPAGENUMS标志(我打印图形,不需要分页)。谢谢嗯,我撒谎了,它现在也崩溃了。错误代码是:0x000006E4I并不感到非常惊讶。PrintDlg出了什么问题,可能是PrintDlgEx出了什么问题。我不确定您是如何得到代码0x000006E4的,但它经常映射到RPC\u S\u不支持。当您看到此崩溃时,是否编译为32位并在64位计算机上运行?是跨多台64位计算机的吗?我最近的评论与此无关-它是基于对.net代码的错误假设。好的,擦掉它-我想我找到了:您很可能在.net库中对WinMain的定义中缺少了
[STAThreadAttribute]