首页 / C# / C DLL LPCTSTR到C#字符串
C DLL LPCTSTR到C#字符串
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C DLL LPCTSTR到C#字符串,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1716字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试将字符串从C DLL转换为C#.
输出的符号不正确-{栠搂?珯获?????赠琹玴ɡ???}
这是我的代码:
DLL文件
_declspec(dllexport) int __stdcall myClass(LPCTSTR& z)
{
z = _T("Test String");
return 0;
}
我的C#代码读取C DLL:
[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern void myClass(StringBuilder z);
static void Main(string[] args)
{
StringBuilder z = new StringBuilder();
myClass(z);
}
解决方法:
首先,确保在C中定义了UNICODE宏,以便_T输出wchar_t数据,而LPCTSTR表示const wchar_t *.这就是CharSet.Unicode所期望的.顺便说一句,如果您也不想支持ANSI版本,那么我不会为所有_T东西烦恼,而只在各处使用Unicode,那么代码将变得更加简单.
同样,您的C函数返回一个int,但是您的C#函数期望一个void.那里不匹配(除非您打算将PreserveSig设置为false).
在C#端,当您提供StringBuilder时,这意味着您在C端提供了一个缓冲区,并且希望它填充该缓冲区.正确的用法是这样的:
_declspec(dllexport) int __stdcall myClass(LPCTSTR z, int zSize)
{
_tcscpy_s(z, zSize, _T("Test String"));
return 0;
}
[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern int myClass(StringBuilder z, int zSize);
static void Main(string[] args)
{
StringBuilder z = new StringBuilder(256);
myClass(z, z.Capacity);
}
但是您的代码将返回一个指向静态字符串的指针,编组程序在这里不希望这样做.
如果您想保持C代码不变,可以尝试以下方法:
[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern int myClass(out string z);
static void Main(string[] args)
{
string z;
myClass(out z);
}
我承认我没有测试它,但是它应该可以正常工作,因为此C#签名与C签名匹配.
如果一切失败,则可以尝试自行封送数据:
[DllImport("ecrClassDll.dll")]
static extern unsafe int myClass(void** z);
static unsafe void Main(string[] args)
{
void* z;
myClass(&z);
var str = Marshal.PtrToStringUni(new IntPtr(z));
}
内容总结
以上是互联网集市为您收集整理的C DLL LPCTSTR到C#字符串全部内容,希望文章能够帮你解决C DLL LPCTSTR到C#字符串所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。