gpt4 book ai didi

c# - 调用返回字符串数组的函数

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:15 25 4
gpt4 key购买 nike

我正在尝试调用具有以下签名的函数:

const char ** SWDLLEXPORT org_crosswire_sword_SWModule_parseKeyList(SWHANDLE hSWModule, const char *keyText);

这将返回一个字符串数组。

我有来自 c 的示例用法

const char **results = org_crosswire_sword_SWModule_parseKeyList(module, argv[2]);
while (results && *results) {
printf("%s\n", *results);
++results;
}

我试过的pinvoke如下:

[DllImport(DLLNAME)]
public static extern IntPtr org_crosswire_sword_SWModule_parseKeyList(IntPtr hSWModule, string keyText);

以及使用它的代码:

public IEnumerable<string> ParseKeyList(string keyText)
{
IntPtr keyListPtrs = NativeMethods.org_crosswire_sword_SWModule_parseKeyList(_handle, keyText);
return NativeMethods.MarshalStringArray(keyListPtrs);
}

public static IEnumerable<string> MarshalStringArray(IntPtr arrayPtr)
{
IntPtr ptr = Marshal.ReadIntPtr(arrayPtr);
while(arrayPtr != IntPtr.Zero && ptr != IntPtr.Zero)
{
ptr = Marshal.ReadIntPtr(arrayPtr);
string key = Marshal.PtrToStringAnsi(ptr);
yield return key;
arrayPtr = new IntPtr(arrayPtr.ToInt64() + 1);
}
}

这对 PtrToStringAnsi 行上的第一项有效,对第二项有效。我做错了什么,调用此函数的正确方法是什么。

最佳答案

C++ 代码像这样递增指针:

++results;

这会将地址增加 sizeof(*results) 因为这就是 C++ 指针算法的工作原理。因此,假设 sizeof(*results) 等于 4,就像 32 位机器上的情况一样。然后 ++results 会将地址递增 4。

现在,您的 C# 代码不同了。指针是无类型的,编译器对底层数组元素类型一无所知。所以你的代码

arrayPtr = new IntPtr(arrayPtr.ToInt64() + 1);

将地址递增 1。相反,您需要提供缺少的类型信息。像这样:

arrayPtr = new IntPtr(arrayPtr.ToInt64() + IntPtr.Size);

最重要的是,您的循环实现不正确。您未能在正确的时间更新 ptr。应该是:

public static IEnumerable<string> MarshalStringArray(IntPtr arrayPtr)
{
if (arrayPtr != IntPtr.Zero)
{
IntPtr ptr = Marshal.ReadIntPtr(arrayPtr);
while (ptr != IntPtr.Zero)
{
string key = Marshal.PtrToStringAnsi(ptr);
yield return key;
arrayPtr = new IntPtr(arrayPtr.ToInt64() + IntPtr.Size);
ptr = Marshal.ReadIntPtr(arrayPtr);
}
}
}

您可能更愿意重新转换该方法,使其代码仅包含对 Marshal.ReadIntPtr 的一次调用。

最后一点。 C++ 函数看起来可能正在使用 cdecl 调用约定。您应该检查 SWDLLEXPORT 的定义是什么。仅当 SWDLLEXPORT 指定 __stdcall 时,您的 p/invoke 才是正确的。

关于c# - 调用返回字符串数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22126172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com