2010-04-06 3 views
19

Je suis sur le point d'écrire un Wrapper pour un flux IStream COM interop afin que le code qui attend un flux .NET standard puisse l'utiliser.Une classe wrapper pour un IStream COM interop existe-t-elle déjà?

Cependant il me vient à l'esprit que ce genre de chose a peut-être déjà été fait auparavant (bien que je n'ai pas pu le trouver moi-même avec la recherche sur le web).

Donc, je suis en train de mettre cela ici au cas où je suis sur le point de réinventer la roue.

note J'ai rencontré le code implémentant IStream encapsulant un flux .NET mais j'ai besoin de l'inverse.

Répondre

33

Il le fait, System.Runtime.InteropServices.ComTypes.IStream. Un exemple d'emballage:

using System; 
using iop = System.Runtime.InteropServices; 
using System.Runtime.InteropServices.ComTypes; 

public class ComStreamWrapper : System.IO.Stream { 
    private IStream mSource; 
    private IntPtr mInt64; 

    public ComStreamWrapper(IStream source) { 
    mSource = source; 
    mInt64 = iop.Marshal.AllocCoTaskMem(8); 
    } 

    ~ComStreamWrapper() { 
    iop.Marshal.FreeCoTaskMem(mInt64); 
    } 

    public override bool CanRead { get { return true; } } 
    public override bool CanSeek { get { return true; } } 
    public override bool CanWrite { get { return true; } } 

    public override void Flush() { 
    mSource.Commit(0); 
    } 

    public override long Length { 
    get { 
     STATSTG stat; 
     mSource.Stat(out stat, 1); 
     return stat.cbSize; 
    } 
    } 

    public override long Position { 
    get { throw new NotImplementedException(); } 
    set { throw new NotImplementedException(); } 
    } 

    public override int Read(byte[] buffer, int offset, int count) { 
    if (offset != 0) throw new NotImplementedException(); 
    mSource.Read(buffer, count, mInt64); 
    return iop.Marshal.ReadInt32(mInt64); 
    } 

    public override long Seek(long offset, System.IO.SeekOrigin origin) { 
    mSource.Seek(offset, (int)origin, mInt64); 
    return iop.Marshal.ReadInt64(mInt64); 
    } 

    public override void SetLength(long value) { 
    mSource.SetSize(value); 
    } 

    public override void Write(byte[] buffer, int offset, int count) { 
    if (offset != 0) throw new NotImplementedException(); 
    mSource.Write(buffer, count, IntPtr.Zero); 
    } 
} 
+0

Merci, c'est un excellent démarreur pour 10. – AnthonyWJones

+0

Merci pour cela. Une réponse vraiment utile. –

+0

Comment pourrais-je mettre en œuvre 'Position'? Le consommateur de mon flux en a besoin. –

Questions connexes