在.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);
答案 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类型已经为你做了