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#?