У меня есть функция 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
Дополнительная информация: Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.
Что не так?