none
.net com pinvoke 封送 Marshal.PtrToStructure ANSI RRS feed

  • 问题

  • 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

    但是结构已经指定,为何还是为出现这种问题?

    求救

    2014年4月8日 6:18

答案

  • 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();
                    }
                }
            }

    2014年4月8日 14:48

全部回复

  • 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();
                    }
                }
            }

    2014年4月8日 14:48
  • 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();
                    }
                }
            }

    2014年4月8日 14:48