如何将 char *** 从 C# 传递到 DLL 中的本机函数

问题描述 投票:0回答:1

在C++动态库中有一个导出方法定义如下

int __declspec(dllexport) __stdcall TCPGetConnectionNames(char *** ConnectionNames)

我正在寻找关于 C# 中的 char *** ConectionNames 使用什么输入参数的答案? 对于 char* 参数,我使用 C# 字符串类型。 但是我在 C# 中用什么来表示 char *** 呢?

static extern int  TCPGetConnectionNames(?????? ConnectionNames);

Google 寻找解决方案,但没有找到

c# visual-c++ c++-cli
1个回答
0
投票

如果没有关于如何使用此功能的更多信息,很难说。但猜测:

  • 该变量是一个指向字符串指针数组的指针。
  • 数组似乎以 null 结尾,字符串也是如此。
  • 因此您可以使用
    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);
}
© www.soinside.com 2019 - 2024. All rights reserved.