2011-07-16 15 views
9

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?

+1

SafeArrayGetDim yerine SafeArrayGetUBound kullanmanız gerekir bkz. Http://msdn.microsoft.com/en-us/library/aed339d5-d962-4adc-ac01-6c15a54c51ca%28VS.85%29 – Yahia

cevap

5

Denemek gerektiğini düşünüyorum:

... 
SafeArrayDestroy(*psa); 
*psa = NULL 
... 

Bunun nedeni Net sıralayıcısı bir içine geçersiz (serbest) belleğe bir işaretçi dönüştürmek için çalışacağız yüzden, out olarak strServerList ilan olmasıdır istisnayı provoke edebilecek dizge dizisi.