一連の画像に基づいてライブ ビデオ ストリームを作成するソース フィルターを作成しようとしています。これを行うために、IUnknown のインターフェイスを作成します。
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("F18FC642-5BA2-460D-8D12-23B7ECFA8A3D")]
public interface IVirtualCameraFilter_Crop
{
void SetCurrentImage(Bitmap img);
...
};
そして私のプログラムで私はそれを手に入れます:
pUnk = Marshal.GetIUnknownForObject(sourceFilter);
Marshal.AddRef(pUnk);
filterInterface = Marshal.GetObjectForIUnknown(pUnk) as IVirtualCameraFilter_Crop;
単純な型を渡すと、すべて正常に動作します。しかし、C# Bitmap オブジェクトを渡そうとすると、エラーが発生しますunable to cast Com object to <my object type>
。または、APPCRUSH エラーでアプリケーションがシャットダウンします。
filterInterface.SetCurrentImage(frame);
正しい方法ではないことは理解していますが、パラメーターを渡す他の方法はわかりません。IntPtr を BitmapData に渡そうとしたところ、同じアプリケーション クラッシュが発生しました。では、ビットマップを DirectShow フィルターに渡すにはどうすればよいでしょうか。
結果: コード引用の全体像については、インターフェースを作成します。
[ComImport, InterfaceType (ComInterfaceType.InterfaceIsIUnknown), Guid ("F18FC642-5BA2-460D-8D12-23B7ECFA8A3D")]
public interface IVirtualCameraFilter_Crop
{
unsafe void SetPointerToByteArr (byte * array, int length);
};
実装:
unsafe public void SetPointerToByteArr (byte * array, int length)
{
this.array = new byte [length];
Marshal.Copy (new IntPtr (array), this.array, 0, length);
}
アプリケーションで:
byte [] text = ... get data;
unsafe
{
fixed (byte * ptr = & text [0])
{
filterInterface.SetPointerToByteArr (ptr, text.Length);
}
}