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

本文关键字:返回 函数 NET 从外部 列表 null 结尾 字符串 将以 | 更新日期: 2023-09-27 18:29:18

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

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.Zero的IntPtr或使用Marshall.AllocHGlobal来调用该函数,但我总是得到AccessViolationException

任何关于我应该如何调用这个函数以及如何将返回值放入托管字符串数组的想法都将不胜感激。

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

char **tmplist;
GetNames(&tmplist)

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

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