详细内容请见
http://community.csdn.net/Expert/topic/4297/4297418.xml?temp=.1288568
======因为调用的DLL和相应方都是生产环境的,故对方端是没问题的;
还是怀疑用C#调用时,发的数据有问题,VC6中的有关数据定义:
typedef struct
{
  char Node[9];                //IPX:网段号; TCP:填写字符串"TCP"
  char Address[13];            //IPX:网卡地址; TCP:IP地址
  unsigned int  Socket;        //Socket
}tagNETWORKADD;
int WINAPI KDAPI_Connect(tagNETWORKADD serverAddress[3],char *GYDM,char *GYMM);现在在VC6中的相应代码是:[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct tagNETWORKADD
{
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
    public string Node;     //IPX:网段号; TCP:填写字符串"TCP"   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
    public string Address;  //IPX:网卡地址; TCP:IP地址    public uint Socket;     //Socket
};
[DllImport("d:\\API_HX.DLL")] 
public static extern int KDAPI_Connect([MarshalAs(UnmanagedType.LPArray, SizeConst = 3)]tagNETWORKADD[] serverAddress, string GYDM, string GYMM);...
int nJzReturn = 0;
tagNETWORKADD[] mmac = new tagNETWORKADD[3];
mmac[1].Node = "00000303";
mmac[1].Address = "0050ba698144";
mmac[1].Socket = 28945;
mmac[0].Node = "00000303";
mmac[0].Address = "00055d878f7a";
mmac[0].Socket = 28945;
mmac[2].Node = "00000303 ";
mmac[2].Address = "00055d0057d8";
mmac[2].Socket = 28945;if ((nJzReturn = KDAPI_Connect(mmac, "0097", "654321")) != 0)
{
     this.textBox2.Text += "Connect:"+nJzReturn.ToString();
       if (nJzReturn == -1)
         {
                    this.textBox2.Text += "没有调用InitSystem";
         }
      else if (nJzReturn == -2)
       {
                    this.textBox2.Text += "中间件连接错误";
       }
     ... ...
}返回错误-2:中间件连接错误

解决方案 »

  1.   

    有无简单方法跟踪一下 程序发给 DLL的数据内容是怎样的?这样可以与VC6做的程序比较一下
      

  2.   

    请高手指点啊。VC中的调用代码如下,是正常的
    tagNETWORKADD NetWorkAdd[3];
    strcpyn(NetWorkAdd[0].Address,sizeof(NetWorkAdd[0].Address),(LPCTSTR)m_pDoc->m_strNetWork1,m_pDoc->m_strNetWork1.GetLength(),TRUE);
    strcpyn(NetWorkAdd[1].Address,sizeof(NetWorkAdd[1].Address),(LPCTSTR)m_pDoc->m_strNetWork2,m_pDoc->m_strNetWork2.GetLength(),TRUE);
    strcpyn(NetWorkAdd[2].Address,sizeof(NetWorkAdd[2].Address),(LPCTSTR)m_pDoc->m_strNetWork3,m_pDoc->m_strNetWork3.GetLength(),TRUE);
    strcpyn(NetWorkAdd[0].Node,sizeof(NetWorkAdd[0].Node),(LPCTSTR)m_pDoc->m_strNode1,m_pDoc->m_strNode1.GetLength(),TRUE);
    strcpyn(NetWorkAdd[1].Node,sizeof(NetWorkAdd[1].Node),(LPCTSTR)m_pDoc->m_strNode2,m_pDoc->m_strNode2.GetLength(),TRUE);
    strcpyn(NetWorkAdd[2].Node,sizeof(NetWorkAdd[2].Node),(LPCTSTR)m_pDoc->m_strNode3,m_pDoc->m_strNode3.GetLength(),TRUE);
    NetWorkAdd[0].Socket = m_pDoc->m_nPort1;
    NetWorkAdd[1].Socket = m_pDoc->m_nPort2;
    NetWorkAdd[2].Socket = m_pDoc->m_nPort3; int nJzReturn = 0;
    nJzReturn =f_KDAPI_Connect_MT(NetWorkAdd,(char *)(LPCTSTR)m_pDoc->m_strOperator,(char *)(LPCTSTR)m_pDoc->m_strOperatorPwd,m_nConnectNum-1);
    if(nJzReturn != 0)
    {
    m_strErrorMessage = _T("Connect:");
    if(nJzReturn == -1)
    {
    m_strErrorMessage += _T("没有调用InitSystem");
    }
    else if(nJzReturn == -2)
    {
    m_strErrorMessage += _T("中间件连接错误");
    }
    else if(nJzReturn == -3)
    {
    m_strErrorMessage += _T("OEM未授权");
    }
    else if(nJzReturn == -4)
    {
    m_strErrorMessage += _T("请求失败,数据发送错误");
    }
    else if(nJzReturn == -7)
    {
    m_strErrorMessage += _T("调用reqOEM请求出现其他错误");
    }
    else if(nJzReturn == -10)
    {
    m_strErrorMessage += _T("连接号不合法");
    }
    else 
    {
    m_strErrorMessage += _T("未知");
    }
    return FALSE;
    }
      

  3.   

    后后来装了snifferpro进行抓包,发现网段和地址都送对了,但端口号的位置总是0,怀疑是其SOCKET数据定义有问题,后来改成ushort后,成功了:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public struct tagNETWORKADD
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
                public string Node;     //IPX:网段号; TCP:填写字符串"TCP"
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
                public string Address;  //IPX:网卡地址; TCP:IP地址
               
                public ushort Socket;     //Socket
            };但接下来的就麻烦了:
    API接口通讯包分两类:请求包(tagREQUEST)和应答包(tagRESULT),所有包结构都采用字节对齐。
    A.请求包:用户通过调用API函数KDAPI_Request()来发送请求,每个请求包由两部分组成:包头和包数据。包数据是由每个功能号组成,包头结构是固定,包头结构如下:
    typedef struct  //本结构中功能号(function)与操作方式(czfs)是必须的,其它可选默认值
    {
      unsigned short length;       //长度(整个数据包长度)
      unsigned short crc ;         //CRC校验码,从serio 开始计算,暂时保留,默认值:0
      unsigned short serio;        //序列号(按请求划分,从1开始) ,默认值:15
      unsigned char function;      //功能号
      unsigned char czfs;         //操作方式(与柜台中的设置相同)
      unsigned long status;        //状态 0正确 其他错误(应答有效) ,默认值:0
    }tagBLOCK_HEAD;
    B. 应答包:用户调用请求包后,紧接着通过API函数KDAPI_Answer()来接收应答包。typedef union
    {
      tagBLOCK_HEAD head;
      tagJYSXX_Request jysxx;//功能1
      tagJYSXX_Request khjy;//功能2
      ... ...
    }tagREQUEST;
    通过如下调用某业务请求:
    int WINAPI KDAPI_Request_MT(tagREQUEST &request, int nConnectionNo, unsigned int *sClientSocket=NULL);
    tagREQUEST中的结构类型太多了,真晕,是否有方法不全部定义完,而只定义几个进行调试?
      

  4.   

    现在把.H转换完了,调用DLL,带请求包和返回包,但程序报错,
    不知是哪里错了,若能跟踪一下DLL就好了
      

  5.   

    经开发商跟踪,说可能是程序 组包有问题,直接被DLL给拒绝了,问题在哪儿啊?