2

在 .NET 3.0 项目中,我需要通过 P/Invoke 进行一些调用(特别是对像 PTConvertPrintTicketToDevMode() 这样的 PrintTicket Provider 函数)。

该框架具有 COM IStream 接口的托管定义: System.Runtime.InteropServices.ComTypes.IStream

我需要它作为 System.IO.Stream,以便我可以轻松地将 .NET 类(如 XmlDocument)与这些导入函数的输出一起使用。但是,除了一次读取和写入一个字节块数据之外,我看不到将它来回转换为System.IO.Stream的更痛苦的方法。对于一项看起来很常见的任务来说,这似乎太笨拙了。

还是我走错了路?

我将PTConvertPrintTicketToDevMode () 导入为:

    [DllImport("prntvpt.dll")]
    public static extern int 
    PTConvertPrintTicketToDevMode(IntPtr hProvider, 
                                  IStream pPrintTicket,
                                  EDefaultDevmodeType baseDevmodeType,
                                  EPrintTicketScope scope,
                                  IntPtr pcbDevmode,
                                  out IntPtr ppDevmode,
                                  [MarshalAs(UnmanagedType.BStr)]out String pbstrErrorMessage);
4

2 回答 2

3

这不是很简单(即框架中没有内置的方法),但想法是实现一个实现 System.Runtime.InteropServices.ComTypes.IStream 的类。这是带有代码的文章。文章没有实现Write方法,不过应该还要10分钟才能写完。看看这个。http://www.sturmnet.org/blog/archives/2005/03/03/cds-csharp-extractor

于 2008-12-22T07:22:54.043 回答
2

您不需要 PInvoke,.Net 中的PrintTicketConverter类型已经为您执行此操作

于 2009-04-10T00:05:54.220 回答