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