Освободить SAFEARRAY из c ++ DLL и c #

У меня есть функция C ++, которая получает данные, и я вызвал ее из C #. Функция получает указатель на SAFEARRAY и заполняет его строками (используя SysAllocString)

Все в порядке, но программа пропускает память.

Я немного поискал и обнаружил, что если я добавлю этот атрибут в подпись метода :

 [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
 out string[] strServerList

Мне нужно выпустить его в коде c ++ (там, где он был размещен), поэтому я создал эту функцию

 [DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "DeallocateExternal")]
 internal static extern void DeallocateExternal(
 [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
 out string[] strServerList);

И в своей dll я написал этот код

void DeallocateExternal(SAFEARRAY** psa)
{
    LONG cDims = SafeArrayGetDim(*psa);
    BSTR* pvData = (BSTR*)((*psa)->pvData); 
    for (LONG x = 0; x < cDims; x++)
    {
       SysFreeString(pvData[x]);
    }
    SafeArrayDestroy(*psa); 
}

Но у меня возникла исключительная ситуация:

Необработанное исключение типа 'System.AccessViolationException' произошла в Tester.exe

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Что не так?

9
задан Groo 26 July 2011 в 09:32
поделиться