System.Runtime.InteropServices.ComTypes.IStream to System.IO.Stream - PullRequest
2 голосов
/ 22 декабря 2008

В проекте .NET 3.0 мне нужно сделать несколько звонков через P / Invoke (в частности, для функций поставщика PrintTicket, таких как 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 ]

3 голосов
/ 22 декабря 2008

Это не совсем просто (т. Е. В фреймворке нет встроенного способа сделать это), но идея заключается в реализации класса, который реализует System.Runtime.InteropServices.ComTypes.IStream. Вот статья с кодом. В статье не реализован метод Write, но для его написания потребуется еще 10 минут. Проверьте это. http://www.sturmnet.org/blog/archives/2005/03/03/cds-csharp-extractor

2 голосов
/ 10 апреля 2009

Вам не нужно PInvoke, тип PrintTicketConverter в .Net уже делает это за вас

...