C#元帅空值终止字符串数组

C#元帅空值终止字符串数组

问题描述:

我试图导入以下:C#元帅空值终止字符串数组

const char * const *object_get_prop_names(propobject_t *ocr); 

为:

[DllImport("vender.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 
private static extern IntPtr object_get_prop_names(int* osr); 

基于:https://limbioliong.wordpress.com/2011/08/14/returning-an-array-of-strings-from-c-to-c-part-1/

我已经试过如下:

var pNames = object_get_prop_names(hdl); 

int StringCount = 200; //how do I know string count? 

IntPtr[] pIntPtrArray = new IntPtr[StringCount]; 
ManagedStringArray = new string[StringCount]; 

Marshal.Copy(pNames, pIntPtrArray, 0, StringCount); 

for (int i = 0; i < StringCount; i++) 
{ 
    ManagedStringArray[i] = Marshal.PtrToStringAnsi(pIntPtrArray[i]); 
    //Marshal.FreeCoTaskMem(pIntPtrArray[i]); crashes 
} 

//Marshal.FreeCoTaskMem(pUnmanagedStringArray); crashes 

这个工程,但我猜我有内存泄漏和访问内存我不应该。

我该如何释放内存?

我如何知道计数?这是来自一个供应商,他们不会修改这个dll对我来说很小。 :)

还原谅我钻研我知道很少的东西。

+1

它返回const char *,所以没有太多理由担心释放字符串。必须有一些*种方法来找出有多少字符串。我会寻找IntPtr.Zero或一个空字符串。您不能安全地使用Marshal.Copy(),直到您知道为每个元素使用Marshal.ReadIntPtr(),每次通过IntPtr.Size递增pName。 –

+0

@Hans工作!我阅读,直到我得到一个空。你能写出解决方案,以便我可以给你信用? – ginalster

继汉斯的建议:

var pNames = object_get_prop_names(hdl); 
if (h == IntPtr.Zero) 
{ 
    return null; 
} 

var nameList = new List<string>(); 
int elementSize = Marshal.SizeOf(typeof(IntPtr)); 

for (int i = 0; i < 200; i++) //don't know length, pick large number 
{ 
    var ptr = Marshal.ReadIntPtr(pNames, i * elementSize); 
    var str = Marshal.PtrToStringAnsi(ptr); 
    if (!string.IsNullOrWhiteSpace(str)) 
    { 
     nameList.Add(str); 
    } 
    else //end of pNames 
    { 
     break; 
    } 
} 

的伟大工程。我无法知道有多少个房产名称,所以我只需要选择比可能的房产名称数量更多的房产。