簡體   English   中英

C#元帥空終止的字符串數組

[英]c# Marshal null-terminated string array

我正在嘗試導入以下內容:

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。 :)

也請原諒我鑽研一些我不太了解的東西。

遵循漢斯的建議:

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; 
    }
}

效果很好。 我無法知道有多少個屬性名稱,所以我只需要選擇比可能的屬性名稱更大的數字即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM