在C++动态库中有一个导出方法定义如下
int __declspec(dllexport) __stdcall TCPGetConnectionNames(char *** ConnectionNames)
我正在寻找关于 C# 中的 char *** ConectionNames 使用什么输入参数的答案? 对于 char* 参数,我使用 C# 字符串类型。 但是我在 C# 中用什么来表示 char *** 呢?
static extern int TCPGetConnectionNames(?????? ConnectionNames);
Google 寻找解决方案,但没有找到
如果没有关于如何使用此功能的更多信息,很难说。但猜测:
out
来取消引用第一级指针。IntPtr
大小的值,这些值本身就是字符串指针。当你得到一个空指针时停止。Marshal.PtrToStringAnsi
读取以空结尾的 ANSI 字符串。Free
方法,在 finally
中调用它。bool
。如果是后者,你可以使用Marshal.GetLastWin32Error
static extern int TCPGetConnectionNames([Out] out IntPtr ConnectionNames);
你可以这样使用它
var list = new List<string>();
if (!TCPGetConnectionNames(out var ptr)
throw new Win32Exception(Marshal.GetLastWin32Error());
try
{
for (var offset = ptr; ; offset += IntPtr.Size)
{
var str = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(offset))
if (str == null)
break;
list.Add(str);
}
}
finally
{
FreePointerUsingSomeFunction(ptr);
}