【问题标题】:Print EMF (WMF) from the Command Line using SHIMGVW.DLL使用 SHIMGVW.DLL 从命令行打印 EMF (WMF)
【发布时间】:2010-10-19 12:18:33
【问题描述】:

适用于 Windows XP / Windows Server 2003

我正在尝试从命令行使用 Windows 图片和传真查看器 (shimgvw.dll) 将 EMF(或 WMF)文件格式打印到虚拟打印机“Microsoft XPS Document Writer”。我希望生成的 XPS 是矢量格式,就像 WMF/EMF 一样。

它适用于除 WMF 和 EMF 之外的所有图像格式。 XPS 打印机保存对话框出现,但保存的 XPS 文件为空。

如果我加载 WMF 并从 Windows 图片和 FaxViewer GUI(而不是从命令行)单击文件>打印,我可以做到这一点。此外,如果我在 Windows 资源管理器中右键单击 WMF 文件并单击“打印”,它将不允许打印所选的 WMF 文件(它会将 WMF 和 EMF 文件从列表中过滤掉)。

代码:
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = @"C:\WINDOWS\System32\rundll32.exe";
info.Arguments = @"C:\WINDOWS\System32\shimgvw.dll,ImageView_PrintTo /pt ""c:\vectorImage.emf"" ""Microsoft XPS Document Writer""";
Process.Start(info);

不久前我已经阅读了很多关于 WMF 漏洞利用的信息,并且只能假设这些文件的直接打印已被删除?但是,如果我可以从 GUI 打印这些 WMF 文件,那么我看不到如何避免利用。

我想做的是以编程方式从 WMF/EMF 文件创建一个 XPS 矢量文件,无需用户交互。我想我应该能够做到这一点,因为涉及的所有格式都属于到微软。

【问题讨论】:

    标签: printing vector xps .emf wmf


    【解决方案1】:

    查看以下 C 语言示例,了解如何将 GDI 命令放入 XPS 文档: http://blogs.msdn.com/fyuan/archive/2005/09/16/469076.aspx

    您要做的是创建打印机 DC,调用 StartDoc,调用 StartPage,然后设置放置 emf 的视口和窗口比例,调用 PlayEnhMetaFile()、EndPage、EndDoc。

    冯远介绍的技巧是使用 StartDoc 的 DocInfo 参数来指定输出 XPS 文件名,我的建议是将元文件内容播放到打印机 DC 中。

    我相信 EMF 漏洞利用已被 Microsoft 更新关闭。您可能看到的问题是由于 GDI 和 XPS 打印路径是分开的,并且在这种极端情况下没有努力将它们连接起来。

    -杰森

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2013-10-08
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多