C#使用C++的托管Dll,使用pin_ptr传递String^,字符串尾部出现大量屯,要如何处理才能返回正确字符串?

代码C++//头文件及命名空间略public ref class Un { public: int C(String^ s) { pin_ptr<const wchar_t>cx; cx = PtrToStringChars(s); allspace::Char cs=cx;//将类型为const wchar_t* 的cx转换成const char * ErrMsg(cs);//MessageBoxA(0,cs,"错误",MB_ICONERROR); return 0; } };C# private void Button_Click(object sender, RoutedEventArgs e) { My.Un un = new My.Un(); StringBuilder strb=new StringBuilder("String"); un.C(strb.ToString()); }运行结果见图

一个是byvaltstr改为byvalstr试试看,否则传递过去可能程序只能识别到第一个字符
以及RTDB_TAGNAME_LENGTH的长度,呃……看样子是个常量应该固定的吧?
然后inkInfoBytes不用new初始化其实……调用处检查一下inkInfoBytes的长度

DLL那边有源代码的话最好对着dll调试,在函数入口点下断点,看看传递进去的东西是什么样的,这样比较容易判断故障。
调试方法就是打开dll的工程,C#的exe复制到debug文件夹里,在工程设置里面调试那边把启动程序设置成C#的那个exe,然后dll代码里下断点,然后开始调试追问

传进去的东西,StringBuilding的对象strb
vs可以看实时的值
显示的字符串是正确的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-10
代码有问题吧,先Ctrl+D,建议检查赋值代码和输出代码。追问

赋值代码
1.String^转成wchar_t*用的
pin_ptr x=
PtrToStringChars(arg)
2.const wchar_t*转成char *用的wcstombs

都是系统api

输出就是把wcstombs转换后的char*字符串输出了

用MessageBoxA直接输出

追答

转换呢?

你把那个字符串赋一个其它的值测试一下,或者直接手动把后面的字符赋一个空值

追问

我也想赋空值

他说const不让我赋,我把const去掉PtrToStringChars又告诉我不是const不能用

追答

const我没怎么用过,不能赋空值吗?

那我真不知道了,不好意思

追问

这样用wcslen似乎也因为字符串没有结尾,得不到正确的值

不过我还没用

赋其他值,如果指的是
String,已经换过几个了,一样
如果指的是
pin_ptr,换不了
如果指的是我这个Char对象
我这个类的构造已经将new出来的char*的所有单位都填零了

追答

那主函数外定义呢

追问

char *n;
public:
Char()
{
n=new char[999];
for(int i=0;i<999;i++)
{
n[i]=0;
}
}
填零过程

其他的已略

追答

不是

我是让你在主函数外定义一下试试

追问

主函数外?全局变量?

而且我这里有任何的maim函数吗?

main

追答

好吧

我怎么知道你没有

追问

哦,只有网页版可以看见代码

你复制一下去浏览器

本来我是排好版的,给我打乱了

找到方法

String.Length,在Length处截断

这么简单的办法一开始居然没想到

本回答被提问者采纳
相似回答