GDI打印API StartDoc函数给出的结果不一致

GDI Print API StartDoc function is giving inconsistent results

本文关键字:结果 不一致 函数 打印 API StartDoc GDI      更新时间:2023-10-16

在我的应用程序中,用户可以打开多个文档,并在打印对话框窗口提示时使用"Microsoft打印到PDF"选项将所有文档打印到PDF,然后选择目标文件夹。现在的情况是,如果选择了30个文档进行打印,那么每次运行时,都会成功地将数量不一致的文档打印到所需文件夹中的pdf中。有时一切都是成功的,有时则不然。我发现使用unicode字符名的文件如下"敥敥敥敥敥敥敥敥"在与包含此打印到pdf过程的代码文件相同的目录中创建。我可以用".pdf"扩展名重命名这些文件,它们是工作的pdf文档。

这是相关代码的一部分:

DOCINFO docInfo;
memset(&docInfo, 0, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = csPlanoName;
docInfo.lpszOutput = csOutputDir + csPlanoName + csExtension;
if(dc.StartDoc(&docInfo) > 0) {
//printing process continues
}

我发现,通过逐步执行代码,StartDoc函数调用会将docInfo.lpszOutput更改为相同的unicode字符"敥敥敥敥敥敥敥敥"。这种情况不会一直发生,测试时特定的文件也不会发生。一次测试文档将成功打印为pdf,另一次测试使用相同的文档,它将创建名为"敥敥敥敥敥敥敥敥".

如有任何帮助,我们将不胜感激。

谨致问候,Chris

什么是csPlanoNamecsOutputDirdocInfo.lpszDocNamedocInfo.lpszOutput必须是指向以null结尾的字符串的指针,并且由于您使用的csOutputDir + csPlanoName + csExtension不能与常规指针一起使用,因此这里可能会发生其他情况。确保csOutputDir + csPlanoName + csExtension的结果不会隐式转换为指针,然后超出范围。

使用字符串转换宏似乎解决了我的问题,成功测试了10多次结果。

CString csFullpath = csOutputDir + csPlanoName + csExtension;
docInfo.lpszOutput = CT2W(csFullpath);