C# 调用C++ char* 用 Marshal.ptrtostringansi 转换乱码

渲染年华 2013-10-24 09:13:29
C++接口函数原型
int callservice(const char* bke056, const char* bke057, const char* bke059,
char* bke058, char* bke060, Integer AppCode, char* ErrorMsg)

//C#动态引用DLL文件
[DllImport("HISSICP3.dll", CharSet = CharSet.Auto, SetLastError = true, EntryPoint = "callservice")]
public static extern int callservice([MarshalAs(UnmanagedType.LPStr)] string bke056,
[MarshalAs(UnmanagedType.LPStr)] string bke057, [MarshalAs(UnmanagedType.LPStr)] string bke059,out string bke058, out string bke060, out int AppCode, out string ErrorMsg);


#region 输入参数
public string inputXmlParam = "";
private string bke056 = "71"; //交易类别代码
private string bke057=string.Empty; //交易流水号
private string bke059=string.Empty; //输入XML
private static IntPtr bke058; //交易验证码
private static IntPtr bke060; //交易输出xml
#endregion

#region 输出参数
public static string outXmlParam; //输出XML
public static int appCode = 0; //执行编码
public static IntPtr msgError; //错误信息
#endregion

/// <summary>
/// 读卡信息
/// </summary>
public void ReadCard()
{
try
{
bae056 = Common.bae056;
aka130 = Common.aka130;
EncodeInputParamToXml(); //调用输入XMl方法
bke059 = inputXmlParam; //XML 赋值
IntPtr retValue = YHInterfaceCls.callservices(bke056, bke057, bke059,ref bke058,ref bke060, ref appCode,ref msgError);
if (retValue != null && appCode == 1) //成功
{
string s = Marshal.PtrToStringAnsi(bke060); //乱码1
string ss = Marshal.PtrToStringAuto(bke060); //乱码2
string ssss = Marshal.PtrToStringUni(bke060); //乱码2
string sss = Marshal.PtrToStringBSTR(bke060); //报错

isSuccess = true; //初始化标识设为真
outXmlParam = Convert.ToString(s);
DecodeOutXmlParam(); //调用输出XML
//bke060 = outXmlParam; //赋值
}


bke060取出来的是一串数字1836597052,一用string s = Marshal.PtrToStringAnsi(bke060);or string ssss = Marshal.PtrToStringUni(bke060); 转换就乱码。求大神回复!
...全文
1253 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
渲染年华 2013-10-24
  • 打赏
  • 举报
回复
引用 5 楼 charju 的回复:
你直接 IntPtr pointer = new IntPtr(1836597052); string s = Marshal.PtrToStringAnsi(pointer); 看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成 IntPtr pointer = new IntPtr(123456);
好的哦!现在连接不上服务器!下午测试的时候再找你哈!
虹桥路3号 2013-10-24
  • 打赏
  • 举报
回复
你直接 IntPtr pointer = new IntPtr(1836597052); string s = Marshal.PtrToStringAnsi(pointer); 看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成 IntPtr pointer = new IntPtr(123456);
渲染年华 2013-10-24
  • 打赏
  • 举报
回复
引用 2 楼 charju 的回复:
这样试试看 IntPtr pointer = new IntPtr(Convert.ToInt32(bke060));//看起来1836597052是个指针地址 string s = Marshal.PtrToStringAnsi(pointer);
对呀!我也认为是个指针地址!那现在取出来的怎么会是乱码呢?
渲染年华 2013-10-24
  • 打赏
  • 举报
回复
哦!你好现在改回来了!还是一样的! [DllImport("HISSICP3.dll", CharSet = CharSet.Ansi, SetLastError = true, CallingConvention = CallingConvention.Cdecl, EntryPoint = "callservice")] public static extern IntPtr callservices([MarshalAs(UnmanagedType.LPStr)] string bke056, [MarshalAs(UnmanagedType.LPStr)] string bke057, [MarshalAs(UnmanagedType.LPStr)] string bke059,ref IntPtr bke058,ref IntPtr bke060, ref int AppCode,ref IntPtr ErrorMsg);
虹桥路3号 2013-10-24
  • 打赏
  • 举报
回复
这样试试看 IntPtr pointer = new IntPtr(Convert.ToInt32(bke060));//看起来1836597052是个指针地址 string s = Marshal.PtrToStringAnsi(pointer);
虹桥路3号 2013-10-24
  • 打赏
  • 举报
回复
你声明的bke060是string类型的,不是IntPtr,怎么调Marshal.PtrToStringAnsi? 你直接string s = bke060;看看什么结果?
xian_wwq 2013-10-24
  • 打赏
  • 举报
回复
对于char*直接可以直接使用stringbuilder, 记得把stringbuilder给个长度,初始化下
渲染年华 2013-10-24
  • 打赏
  • 举报
回复
引用 6 楼 u012332319 的回复:
[quote=引用 5 楼 charju 的回复:] 你直接 IntPtr pointer = new IntPtr(1836597052); string s = Marshal.PtrToStringAnsi(pointer); 看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成 IntPtr pointer = new IntPtr(123456);
好的哦!现在连接不上服务器!下午测试的时候再找你哈![/quote]你好!现在转换出来的不是乱码,而是Null..怎么回事哦?

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧