Как передать двойной указатель на COM из C # и инициализировать его внутри COM

Я создал метод 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 вылетает при выделении памяти.

1

Решение

Вам не нужно unsafe Вот. Вам нужно изменить объявление функции в конце C #. Параметр буфера должен быть объявлен как:

ref IntPtr pBuffer

Затем, как только вы вызвали функцию, прочитайте содержимое буфера с помощью Marshal.Copy,

Я не экспортирую использование COM из C #, но первый параметр не должен иметь [MarshalAs(UnmanagedType.BStr)]?

Как еще дальше, если вы используете CoTaskMemAlloc вместо newВы можете позволить вызывающей стороне освободить буфер вместо необходимости экспортировать освобождающий объект. Я верю, что вы экспортировали Deloclocator?

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]