Я создал метод COM, который принимает двойной указатель (BYTE **). Внутри COM я выделяю память и инициализирую ее.
Подпись есть;
HRESULT Canny([in] BSTR szLogoPath, [out] BYTE** pBuffer, [out] USHORT* iBufLen);
Проблема заключается в сбоях COM, когда я вызываю его из проекта C #, тогда как он работает нормально, когда я вызываю его из проекта WIN32.
Кроме того, в C # проекте выше метод выглядит как; (BYTE ** отображается как IntPtr)
public virtual void Canny(string szLogoPath,IntPtr pBuffer, out ushort iBufLen);
Мой код C #
LogoFinderClass libCOM = new LogoFinderClass();
unsafe {
byte* buf = null;
IntPtr interopPtr = new IntPtr(&buf);
libCOM.Canny(@"..\Logo.bmp", interopPtr, out bufLen);
}
В C ++ я выделяю память как;
::Canny(BSTR szLogoPath, BYTE** pBuffer, USHORT* iBufLen) {
*pBuffer = new BYTE[1024];
..
}
А при вызове из C # COM вылетает при выделении памяти.
Вам не нужно unsafe
Вот. Вам нужно изменить объявление функции в конце C #. Параметр буфера должен быть объявлен как:
ref IntPtr pBuffer
Затем, как только вы вызвали функцию, прочитайте содержимое буфера с помощью Marshal.Copy
,
Я не экспортирую использование COM из C #, но первый параметр не должен иметь [MarshalAs(UnmanagedType.BStr)]
?
Как еще дальше, если вы используете CoTaskMemAlloc
вместо new
Вы можете позволить вызывающей стороне освободить буфер вместо необходимости экспортировать освобождающий объект. Я верю, что вы экспортировали Deloclocator?
Других решений пока нет …