Я пытаюсь создать исходный фильтр, который создает прямой видеопоток на основе последовательности изображений. Для этого я делаю интерфейс 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;
Когда я передаю простые типы, все работает нормально. Но когда я пытаюсь передать объект Bitmap C#, я получаю сообщение об ошибке 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);
}
}