Verileri alan bir C++ işlevim var ve bunu C# olarak adlandırdım. Bu işlev SAFEARRAY için bir işaretçi alır ve dizelerle (SysAllocString kullanarak) doldururC++ DLL ve SA'dan SAFEARRAY'i bırakın C#
Her şey yolunda, ancak program bellek sızdırıyor.
Ufak bir araştırma yaptım ve yöntem imzası için bu özelliği eklerseniz bulundu:[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
out string[] strServerList
ben c bırakın gerekir ++ kodu (o tahsis edilmiş olduğu), bu yüzden bu fonksiyonu yarattı
[DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "DeallocateExternal")]
internal static extern void DeallocateExternal(
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
out string[] strServerList);
Ve benim dll ben bu kodu
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);
}
yazdığı Ama bir istisna var:
türü 'System.AccessViolationException' türünde işlenmeyen bir özel durum Tester.exe
bilgiye oluştu: okuma veya korunan bellek yazma denendi. Bu genellikle diğer hafızanın bozuk olduğunun bir göstergesidir.
Sorun nedir?
SafeArrayGetDim yerine SafeArrayGetUBound kullanmanız gerekir bkz. Http://msdn.microsoft.com/en-us/library/aed339d5-d962-4adc-ac01-6c15a54c51ca%28VS.85%29 – Yahia