p_tan's blog

勉強日記です。ツッコミ大歓迎

COM構造化ストレージの IStream 生ポインタを C# 側に引き渡す

COM の構造化ストレージのストリームインターフェースであるIStream を生ポインタで持っているとして、 それをC#側からアクセスしたい時。

.NET には、ネイティブのIStream インターフェースに対応する System.Runtime.InteropServices.ComTypes.IStream がある。

IStream の生ポインタを ComTypes.IStream に変換するには、System.Runtime.InteropServices.Marshal.GetTypedObjectForIUnknown メソッドを使えば良い。

C++/CLIのコード例

using namespace System;
using namespace System::Runtime::InteropServices;
...
    IStream *pStream = NULL;

    // ... IStreamのポインタをどうにかして生成...

    // ComTypes::IStream へ変換 
    ComTypes::IStream^ stream =
        (ComTypes::IStream^)Marshal::GetTypedObjectForIUnknown(
            (IntPtr)pStream, ComTypes::IStream::typeid
        );
}