2

.NET 3.0 プロジェクトでは、P/Invoke を介して (特に PTConvertPrintTicketToDevMode() などの PrintTicket プロバイダー関数に対して) いくつかの呼び出しを行う必要があります。

フレームワークには、COM IStream インターフェイスのマネージ定義 System.Runtime.InteropServices.ComTypes.IStreamがあります。

これらのインポートされた関数の出力で .NET クラス (XmlDocument など) を簡単に使用できるように、これを System.IO.Stream として必要とします。しかし、一度にバイトのブロック単位でデータを読み書きする以外に、これを前後に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 に答える