gpt4 book ai didi

c# - 使用 P/Invoke 调用带有 char* 参数的 C DLL 函数

转载 作者:太空狗 更新时间:2023-10-29 22:17:12 27 4
gpt4 key购买 nike

我已经阅读过其他类似的问题,但它们并没有解决这个特定的问题。我有一个带有 touppercase 函数的旧 C 库(作为示例)。这需要一个 char* 并返回一个 char*。但是,返回的指针是指向同一个字符串的指针(别问我没写)。

函数如下所示:

__declspec(dllexport)
char * __cdecl touppercase(char *ps_source)
{
char *ps_buffer = NULL;

assert (ps_source != NULL);

ps_buffer = ps_source;
while (*ps_buffer != '\0')
{
*ps_buffer = toupper(*ps_buffer);
ps_buffer++;
}
*ps_buffer = '\0';
return (ps_source);
}

声明它的 C# 代码如下所示:

    [DllImport("mydll.dll", EntryPoint = "touppercase",
CharSet = CharSet.Ansi, ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
private static extern System.IntPtr touppercase(string postData);

在我的应用程序中对此的调用看起来像

     string sTest2 = Marshal.PtrToStringAnsi(to_uppercase(sTest));

然而 sTest2 最终只是一个随机字符串。

我用相同的参数向同一个 dll 添加了一个测试函数,但这会在本地分配内存并复制字符串。这很好用。为什么原始版本现在可以使用?

注意:更新 dll 库本身不是一个选项。

最佳答案

该函数正在修改引用,因此您应该使用 stringbuilder:

[DllImport("dll.dll", EntryPoint="touppercase",
CharSet = CharSet.Ansi, ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
private static extern System.IntPtr touppercase(StringBuilder postData);

可以这样调用它:

    StringBuilder sTest = new StringBuilder("abs");
touppercase(sTest);
string result = sTest.ToString();

对于返回指针的解释->Ben Voigt

关于c# - 使用 P/Invoke 调用带有 char* 参数的 C DLL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153466/

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