当前位置:编程学习 > C#/ASP.NET >>

C#调用C++提供的dll出现的问题

我使用c++提供的dll调用的时候出现这个问题
运行库遇到了错误。此错误的地址为 0x79e71bd7,在线程 0x11f0 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
c++的结构为
function GetPosStatus(IP: PChar; Port: Integer; AQryGateWay: PQryGateWayInfoRet): Integer; export; stdcall;

PQryGateWayInfoRet = ^TQryGateWayInfoRet;
  TQryGateWayInfoRet = packed record
    BasicResponse: TBasicResponse;
    RunInfo: TtagINFORUN;
    DebugInfo: TtagINFODebug;
  end;

TtagINFORUN = packed record
  bLoginOK: Integer;
  bGetFLowNoOK: Integer;
  bDispInitOK: Integer;
  PrivateSign: LongWord;
  CtlStatus: Char;
  ErrInfo: array[0..127] of char;
  PosStatus: array[0..127] of Byte;
  StatusBar485: Byte;
    CurrDineNo: Byte;
  end;
  TtagINFODebug = packed record
  FlowHead: LongWord;
  FlowTail: LongWord;
  CurrFlowNo: LongWord;
  SNo: LongWord;
  end;
C#为:
[DllImport("GateWayDll.dll")]
public static extern int GetPosStatus(byte[] ip,int port,ref TQryGateWayInfoRet ps);

    [StructLayout(LayoutKind.Sequential)]
    public struct TtagINFODebug
    {
        public UInt32 FlowHead;
        public UInt32 FlowTail;
        public UInt32 CurrFlowNo;
        public UInt32 SNo;
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct TQryGateWayInfoRet
    {
        public TBasicResponse tbRes;
        public TtagINFORUN tgRun;
        public TtagINFODebug tgDebug;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct TtagINFORUN
    {
        public UInt16 bLoginOK;
        public UInt16 bGetFLowNoOK;
        public UInt16 bDispInitOK;
        public UInt32 PrivateSign;
        public byte CtlStatus;
        [MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]
        public string ErrInfo;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public byte[] PosStatus;
        public byte StatusBar485;
        public byte CurrDineNo;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct TBasicResponse
    {
        [MarshalAs(UnmanagedType.LPTStr, SizeConst = 3)]
        public string TranCode;
        public UInt16 RetCode;
    }

--------------------编程问答-------------------- C++写的DLL?这个明显是Delphi的声明。
没有看到TBasicResponse的原始声明?
你先比较一下两边结构的大小是否一致。 --------------------编程问答-------------------- 那可能就是delphi的
TBasicResponse = packed record
TranCode: array[0..2] of char;//交易码
RetCode: Integer;
TBasicResponse在这,麻烦你帮我看看,搞了几天了一直出现那样的错误 --------------------编程问答-------------------- 大小比较:
Delphi
TBasicResponse=7
TtagINFORUN=275
TtagINFODebug=16
TQryGateWayInfoRet=298

C#
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有原始调用例子吗? --------------------编程问答-------------------- 通过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()函数。 --------------------编程问答-------------------- GetPosStatus没有原始调用例子,按照了你的写法,还是会出现以前的错误 --------------------编程问答-------------------- 他们的大小你是怎么计算出来的,就是上面的 --------------------编程问答-------------------- C#
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;
}
--------------------编程问答-------------------- 哦,我搞错了,但是这样还是出现以前的错误 --------------------编程问答-------------------- 仔细调了下,没问题了,但是结果好象有点问题,ErrInfo和PosStatus这两个里面全为null,好象不正常 --------------------编程问答-------------------- 没有调试环境,就只能帮到这儿了。 --------------------编程问答-------------------- 谢谢! --------------------编程问答-------------------- zswang还在吗,那个嵌套结构是不是定义的有问题呀? --------------------编程问答-------------------- 伴水老大好。。

应该就是内存对齐的问题 packed就是按照1字节对齐

那个嵌套结构是不是定义的有问题呀?
你现在是怎么定义的。 --------------------编程问答--------------------     * syntongs
    * 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; 
        } 
--------------------编程问答-------------------- 怎么没人了
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,