C#从返回char指针的c++函数中获取字符串/字符值

Posted

技术标签:

【中文标题】C#从返回char指针的c++函数中获取字符串/字符值【英文标题】:C# get string/characters value from c++ function which return char pointer 【发布时间】:2011-05-02 10:13:09 【问题描述】:

我有一个用 C++ 编写的 DLL。这个DLL的一个函数如下代码:

C++ 代码:

     char _H *GetPalette() 

            -------Functions body

            -------Functions body

            return pPaletteString;

      

现在我想从 C# 代码中的 GetPalette() 函数中获取托盘字符串。

如何从该函数中获取字符串? 我已经在 C# 代码中尝试过这个。但无法得到正确的结果。

C#代码:

    [DllImport("cl.dll", EntryPoint = "GetPalette@0", CallingConvention = CallingConvention.StdCall)]

    private static extern IntPtr libGetPalette();

    public IntPtr GetPalette()
    
        return libGetPalette();
    

最后我想得到这样的字符串

            IntPtr result;
            result = imgProcess.GetPallet();

            string pallet;
            pallet = Marshal.PtrToStringAnsi(result);
            MessageBox.Show(pallet);

此代码无法正常工作。 有人可以帮我吗,我怎样才能从我的 C++ DLL 函数中获取字符串值?

谢谢

沙赫利亚

【问题讨论】:

最好定义您遇到的错误或行为。我们怎么知道“这段代码不能正常工作”是什么意思? 我从该代码中得到了 '-->' 字符。但它应该像'473757.473767.574767......'字符串一样返回。 【参考方案1】:

您可以使用字符串返回类型在 C# 代码中定义您的 C++ 函数。

[DllImport("cl.dll")]
private static extern string GetPalette();

而不仅仅是在 C# 代码中调用它。

string palette = GetPalette();

DllImport 属性中,您可能需要设置正确的调用约定CallingConvention 和字符编码CharSet

【讨论】:

我想您可能想解释返回缓冲区的 onwership 语义(IIRC .NET 将使用 free() 释放内存?) 感谢 Lukas Kabrt。你的答案是 100% 正确的。我使用了 CharSet=CharSet.Ansi 并将我的函数返回类型更改为字符串。现在我得到了正确的结果。【参考方案2】:

您告诉 C# 调用约定是 __stdcall,但没有证据表明函数本身上有 __stdcall 标记。此外,char* 可以是 UTF-8。

【讨论】:

实际上,我是 .net Interoperability/Marshalling 的新手。我使用了来自其他来源的这个 stdcall 约定代码。也许我错了。那么我现在该怎么做才能从那个 C++ DLL 函数中获取字符串呢?谢谢 更改您的 C# 代码以匹配 C++ 代码的调用约定将是一个开始。

以上是关于C#从返回char指针的c++函数中获取字符串/字符值的主要内容,如果未能解决你的问题,请参考以下文章

调用从 c# 返回 char* 的 c++ dll 函数。无法使用 DllImport()

为啥我不能在发布版本中将 char* 字符串从 C++ 返回到 C#?

将 C# 字符串传递给 C++,并将 C++ 结果(字符串、char*.. 任何)传递给 C#

c# 获取非托管指针长度

C#中字符串中的char *指针

将 c++ dll 的 char 指针数组传递给 c# 字符串