C++写的DLL?这个明显是Delphi的声明。
没有看到TBasicResponse的原始声明?
你先比较一下两边结构的大小是否一致。

解决方案 »

  1.   

    那可能就是delphi的
    TBasicResponse = packed record
    TranCode: array[0..2] of char;//交易码
    RetCode: Integer;
    TBasicResponse在这,麻烦你帮我看看,搞了几天了一直出现那样的错误
      

  2.   

    大小比较:
    Delphi
    TBasicResponse=7
    TtagINFORUN=275
    TtagINFODebug=16
    TQryGateWayInfoRet=298C#
    TBasicResponse=8
    TtagINFORUN=152
    TtagINFODebug=16
    TQryGateWayInfoRet=176
    明显不一样,这个得改
      

  3.   

    结构这样声明就一样大小了。
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TtagINFODebug
    {
        public uint FlowHead;
        public uint FlowTail;
        public uint CurrFlowNo;
        public uint SNo;
    }[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TQryGateWayInfoRet
    {
        public TBasicResponse tbRes;
        public TtagINFORUN tgRun;
        public TtagINFODebug tgDebug;
    }[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TtagINFORUN
    {
        public int bLoginOK;
        public int bGetFLowNoOK;
        public int bDispInitOK;
        public uint PrivateSign;
        public byte CtlStatus;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public byte[] ErrInfo;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public byte[] PosStatus;
        public byte StatusBar485;
        public byte CurrDineNo;
    }[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TBasicResponse
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public byte[] TranCode;
        public int RetCode;
    }
    函数大概是这样:
    [DllImport("GateWayDll.dll", CharSet = CharSet.Ansi)]
    public static extern int GetPosStatus(string ip, int port,
        ref TQryGateWayInfoRet ps); 
    “TtagINFORUN.ErrInfo”
    获取文字信息可以通过:Encoding.Default.GetString()。
    先调用不出异常再考虑吧GetPosStatus有原始调用例子吗?
      

  4.   

    通过Marshal.SizeOf()方法可以计算结构的大小。
    private void button1_Click(object sender, EventArgs e)
    {
        Console.WriteLine("TBasicResponse={0}", Marshal.SizeOf(typeof(TBasicResponse)));
        Console.WriteLine("TtagINFORUN={0}", Marshal.SizeOf(typeof(TtagINFORUN)));
        Console.WriteLine("TtagINFODebug={0}", Marshal.SizeOf(typeof(TtagINFODebug)));
        Console.WriteLine("TQryGateWayInfoRet={0}", Marshal.SizeOf(typeof(TQryGateWayInfoRet)));
    }
    Delphi中也有SizeOf()函数。
      

  5.   

    GetPosStatus没有原始调用例子,按照了你的写法,还是会出现以前的错误
      

  6.   

    C#
    TBasicResponse=5
    TtagINFORUN=275
    TtagINFODebug=16
    TQryGateWayInfoRet=296
    你的那样写出来的结果是这样
      

  7.   

    看好,复制好。
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TBasicResponse
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public byte[] TranCode;
        public int RetCode;
    }
      

  8.   

    仔细调了下,没问题了,但是结果好象有点问题,ErrInfo和PosStatus这两个里面全为null,好象不正常
      

  9.   

    zswang还在吗,那个嵌套结构是不是定义的有问题呀?
      

  10.   

    伴水老大好。。应该就是内存对齐的问题 packed就是按照1字节对齐那个嵌套结构是不是定义的有问题呀?
    你现在是怎么定义的。
      

  11.   

        * syntongs
        * syntongs
        * 等 级:
    发表于:2008-02-27 10:12:2416楼 得分:0
    zswang还在吗,那个嵌套结构是不是定义的有问题呀?

    这种提问方式没有一点参考价值。是不是有问题我怎么知道。-_-!!!“GateWayDll.dll”又不是我提供的。
    什么现象?输入什么输出什么?你期望的结果是什么?什么才是正确的结果?确认是因为api封装导致?
    你自己先分析清楚。
    如果代码不是那么多,建议你装个Delphi直接用Delphi做一下测试。
      

  12.   

    还是出同样的问题
    运行库遇到了错误。此错误的地址为   0x79e71bd7,在线程   0x11f0   上。错误代码为   0xc0000005。此错误可能是   CLR   中的   bug,或者是用户代码的不安全部分或不可验证部分中的   bug。此   bug   的常见来源包括用户对   COM-interop   或   PInvoke   的封送处理错误,这些错误可能会损坏堆栈。
    [StructLayout(LayoutKind.Sequential,   CharSet   =   CharSet.Ansi)] 
            public   struct   TQryGateWayInfoRet 
            { 
                    public   TBasicResponse   tbRes; 
                    public   TtagINFORUN   tgRun; 
                    public   TtagINFODebug   tgDebug; 
            }