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

GDI Print API StartDoc function is giving inconsistent results

在我的应用程序中,当用户在打印对话框 window 中收到提示时,可以使用 "Microsoft print to pdf" 选项打开多个文档并将所有文档打印为 PDF,然后选择目标文件夹.现在发生的情况是,如果选择了 30 个文档进行打印,每次 运行 时,都会将不一致的数量成功打印到所需文件夹中的 pdf 中。有时一切都成功,有时则不然。我发现在与包含此打印到 pdf 过程的代码文件相同的目录中创建具有 unicode 字符名称的文件,如“理理理理理理”。我可以使用“.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,另一个测试相同的文档,它将创建名为“理理理理理理”的文件。

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

此致, 克里斯

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

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

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