2008-12-22 10 views
2

Dans un projet .NET 3.0, je dois effectuer des appels via P/Invoke (en particulier pour les fonctions PrintTicket Provider comme PTConvertPrintTicketToDevMode()).System.Runtime.InteropServices.ComTypes.IStream à System.IO.Stream

Le cadre a une définition managée de l'interface COM IStream: System.Runtime.InteropServices.ComTypes.IStream

J'ai besoin ce que System.IO.Stream pour que je puisse facilement utiliser des classes .NET (comme XmlDocument) avec la sortie de ces importations les fonctions. Mais je ne peux pas voir une façon moins pénible de convertir ce retour et System.IO.Stream autre que de lire et d'écrire des données d'un bloc d'octets à la fois. Cela semble trop clair pour une tâche qui semble très commune. Ou est-ce que j'y vais dans le mauvais sens?

Je PTConvertPrintTicketToDevMode() importé comme:

[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); 

Répondre

3

Ce n'est pas vraiment simple (.-À-dire qu'il n'y a pas construit de la manière de le faire dans le cadre), mais l'idée est de mettre en œuvre une classe qui implémente System.Runtime.InteropServices.ComTypes.IStream. Voici un article avec le code. L'article n'implémente pas la méthode Write, mais cela devrait prendre encore 10 minutes pour l'écrire. Vérifiez-le. http://www.sturmnet.org/blog/archives/2005/03/03/cds-csharp-extractor

+0

merci. C'était une façon que je regardais. Je ne pouvais juste pas croire, ils ont fait l'IStream w/o l'emballage. – moogs

Questions connexes