System.Runtime.InteropServices.ComTypes.IStream到System.IO.Stream

时间:2008-12-22 06:47:49

标签: c# .net com interop pinvoke

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

该框架具有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);

2 个答案:

答案 0 :(得分:3)

它并不是那么简单(即没有内置的方法在框架中完成它),但是想法是实现一个实现System.Runtime.InteropServices.ComTypes.IStream的类。这是一篇包含代码的文章。本文没有实现Write方法,但应该再写10分钟。看看这个。 http://www.sturmnet.org/blog/archives/2005/03/03/cds-csharp-extractor

答案 1 :(得分:2)

你不应该需要PInvoke,.Net中的PrintTicketConverter类型已经为你做了