Действительно ли обертка классифицирует для взаимодействующего с COM IStream, уже существуют?

Я собираюсь записать Обертку для взаимодействующего с COM IStream так, чтобы код, который ожидает стандартный Поток.NET, мог использовать его.

Однако мне приходит в голову, что этот вид вещи, возможно, уже был сделан прежде (хотя я не смог найти его сам с веб-поиском).

Таким образом, я просто помещаю это здесь в случае, если я собираюсь изобрести велосипед.

Обратите внимание, что я столкнулся с кодом, реализовав IStream обертывание потока.NET, но мне нужен реверс.

22
задан AnthonyWJones 6 April 2010 в 15:37
поделиться

1 ответ

Он есть, System.Runtime.InteropServices.ComTypes .IStream . Пример оболочки:

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);
  }
}
36
ответ дан 29 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: