积极答复者
.net com pinvoke 封送 Marshal.PtrToStructure ANSI

问题
-
C++提供一个dll里面有一个方法Test 定义为
int Test(QueryInfo *in,OutInfo *outresult);
QueryInfo {
char BillNo[20];
}
OutInfo{
char ResCode[2];
char Trace[6];
}
C# 定义调用如下
[DllImport("posinf.dll", EntryPoint = "QMF_Traffic_QUERY_SC", CallingConvention = CallingConvention.StdCall)]
public static extern int Test(ref QueryInfo queryInfo, ref OutInfo outInfo);[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct QueryInfo {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string BillNo;
}
public struct OutInfo {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string ResCode;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string Trace;
}
先调用问题如下:
输入没问题,后面的OUT参数 ResCode 本应该返回 “EE”
结果却只有“E”
多次尝试,使用
[DllImport("posinf.dll", EntryPoint = "QMF_Traffic_QUERY_SC", CallingConvention = CallingConvention.StdCall)]
public static extern int Test(Intptr queryInfo, Intptr outInfo);Marshal.PtrToStructure 转换同样有问题
当使用 Marshal.PtrToAnsiString 发现没有问题,意思是内存数据返回没有问题,但是在解析或者转换的时候出现问题
返回字符集均为 Ansi
但是结构已经指定,为何还是为出现这种问题?
求救
答案
-
Hi, 可以试一下直接定义成数组,使用时再转换成string:
public struct OutInfo { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] private char[] ResCode_Data; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] private char[] Trace_Data; public string ResCode { get { return new string(ResCode_Data); } set { ResCode_Data = value.ToCharArray(); } } public string Trace { get { return new string(Trace_Data); } set { Trace_Data = value.ToCharArray(); } } }
- 已标记为答案 CaillenModerator 2014年4月17日 9:58
全部回复
-
Hi, 可以试一下直接定义成数组,使用时再转换成string:
public struct OutInfo { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] private char[] ResCode_Data; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] private char[] Trace_Data; public string ResCode { get { return new string(ResCode_Data); } set { ResCode_Data = value.ToCharArray(); } } public string Trace { get { return new string(Trace_Data); } set { Trace_Data = value.ToCharArray(); } } }
-
Hi, 可以试一下直接定义成数组,使用时再转换成string:
public struct OutInfo { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] private char[] ResCode_Data; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] private char[] Trace_Data; public string ResCode { get { return new string(ResCode_Data); } set { ResCode_Data = value.ToCharArray(); } } public string Trace { get { return new string(Trace_Data); } set { Trace_Data = value.ToCharArray(); } } }
- 已标记为答案 CaillenModerator 2014年4月17日 9:58