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); 转换就乱码。求大神回复!