从外部函数返回以null结尾的字符串列表到.NET

时间:2012-03-29 10:39:27

标签: c# c++ vb.net pinvoke

我正在尝试使用VB.NET调用外部C ++函数(C#中的答案很好,我可以转换回来),它返回设备名称列表。这是一个指向空终止的char数组的空终止数组的指针(如果我误解了我正在处理的内容,请使用函数签名纠正我):

long GetNames(char*** names)

我发现的类似问题的大部分答案都涉及更多类似的问题:

long GetNames(char** names, int length)

从我读过的内容看来,我需要给它一个IntPtr但是我不确定应该如何初始化它,在我的情况下我不知道数组的长度。目前,在VB模块中,我有:

<DllImport("MyExternal.dll", CallingConvention:=CallingConvention.Cdecl)> _
Function GetNames(ByRef names as IntPtr) As UInteger
End Function

我尝试通过将IntPtr初始化为IntPtr.Zero或使用Marshall.AllocHGlobal来调用该函数,但我总是得到AccessViolationException

我将非常感谢有关如何调用此函数以及如何将返回值转换为托管字符串数组的任何想法。

编辑:我在本机C中找到了一个示例函数调用,如下所示:

char **tmplist;
GetNames(&tmplist)

1 个答案:

答案 0 :(得分:-1)

* 意味着指向指针的指针,这是非常罕见的。
我希望您在c语言中处理指向指针的指针,这是StringBuilder的ByRef调用。如果你没有收到长度,你可能需要自己做指针算术,直到找到空值。