PInvoke и IStream

У меня есть экспортированная функция из dll, написанная на С++ со следующей подписью:

Foo( LPSTREAM *pStream, UINT &Size ) 

который возвращает поток памяти и, очевидно, его размер. У меня возникают трудности с созданием подписи для экспортируемой функции, а затем попыткой прочитать поток на С#. В какой-то момент удалось использовать «небезопасный» указатель байта для получения информации, но это не соответствует нашим требованиям.

Буду очень признателен за любые мысли, примеры, образцы и т.д.


person Kev    schedule 15.06.2011    source источник


Ответы (1)


Вы можете сделать это так:

[DLLImport(@"mydll.dll")]
public static extern void Foo(out ComTypes.IStream Stream, ref uint Size);

Назовите это так:

ComTypes.IStream Stream = null;
uint Size;
Foo(out Stream, ref Size);

Как обычно, убедитесь, что ваши соглашения о вызовах совпадают (по умолчанию для C# используется stdcall, по умолчанию для C++ — cdecl).


Кроме того, зачем возвращать Size отдельно от потока, если IStream знает его размер и сообщит вам, если вы его попросите?

person David Heffernan    schedule 15.06.2011
comment
Спасибо, Дэйв. Я внес изменения в код, и когда функция экспорта foo выполняется, возникает исключение. - person Kev; 15.06.2011
comment
Сообщение Невозможно привести COM-объект типа «System.__ComObject» к типу интерфейса «System.Runtime.InteropServices.ComTypes.IStream». Эта операция завершилась неудачно, так как вызов QueryInterface компонента COM для интерфейса с IID "{0000000C-0000-0000-C000-000000000046}" завершился сбоем из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) . нить - person Kev; 15.06.2011
comment
@Kev Я немного покопался и теперь уверен, что это работает. Я думаю, проблема в том, что вы не возвращаете интерфейс, который реализует IStream, как указано в сообщении об ошибке. - person David Heffernan; 16.06.2011
comment
Вероятно, это не COM-библиотека, а LSTREAM — это просто указатель на структуру, подобную той, что используется в DevIL и FreeImage. - person greenboxal; 04.03.2013