结构这样声明就一样大小了。 [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有原始调用例子吗?
看好,复制好。 [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct TBasicResponse { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] TranCode; public int RetCode; }
TBasicResponse = packed record
TranCode: array[0..2] of char;//交易码
RetCode: Integer;
TBasicResponse在这,麻烦你帮我看看,搞了几天了一直出现那样的错误
Delphi
TBasicResponse=7
TtagINFORUN=275
TtagINFODebug=16
TQryGateWayInfoRet=298C#
TBasicResponse=8
TtagINFORUN=152
TtagINFODebug=16
TQryGateWayInfoRet=176
明显不一样,这个得改
[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有原始调用例子吗?
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()函数。
TBasicResponse=5
TtagINFORUN=275
TtagINFODebug=16
TQryGateWayInfoRet=296
你的那样写出来的结果是这样
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TBasicResponse
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] TranCode;
public int RetCode;
}
你现在是怎么定义的。
* syntongs
* 等 级:
发表于:2008-02-27 10:12:2416楼 得分:0
zswang还在吗,那个嵌套结构是不是定义的有问题呀?
这种提问方式没有一点参考价值。是不是有问题我怎么知道。-_-!!!“GateWayDll.dll”又不是我提供的。
什么现象?输入什么输出什么?你期望的结果是什么?什么才是正确的结果?确认是因为api封装导致?
你自己先分析清楚。
如果代码不是那么多,建议你装个Delphi直接用Delphi做一下测试。
运行库遇到了错误。此错误的地址为 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;
}