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

3
我有一个用C++编写的DLL。其中一个函数的代码如下:
C++代码:
     char _H *GetPalette() {

            -------Functions body

            -------Functions body

            return pPaletteString;

      }

现在我想从C#代码中的GetPalette()函数获取Pallet字符串。
我该如何从该函数中获取字符串? 我已经尝试在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 函数中获取字符串值? 谢谢。 Shahriar

2
定义您遇到的错误或行为是一个好习惯。我们怎么知道“此代码无法正常工作”是什么意思呢? - Marino Šimić
我从那段代码中得到了“-->”字符。但它应该返回类似于“473757.473767.574767.............”的字符串。 - Shahriar Hasan Sayeed
2个回答

1
你可以在C#代码中定义返回字符串类型的C++函数。
[DllImport("cl.dll")]
private static extern string GetPalette();

然后只需从您的C#代码中调用它即可。

string palette = GetPalette();

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

我认为您可能需要解释一下返回缓冲区的所有权语义(如果我没记错的话,.NET将使用free()释放内存?) - sehe
谢谢Lukas Kabrt。你的答案是100%正确的。我已经使用了CharSet=CharSet.Ansi并将我的函数返回类型更改为字符串。现在我得到了正确的结果。 - Shahriar Hasan Sayeed

1

你告诉了C#调用约定是__stdcall,但函数本身没有标记__stdcall的证据。此外,char*可能是UTF-8。


其实,我在 .net 互操作/封送方面还很新。我从其他来源使用了这个 stdcall 约定代码。也许我错了。那么现在我该怎么做才能从那个 C++ DLL 函数中获取字符串呢?谢谢。 - Shahriar Hasan Sayeed
1
将您的C#代码更改为与C++代码的调用约定相匹配将是一个开始。 - Security Hound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接