详细内容请见
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:中间件连接错误
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:中间件连接错误
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;
}
[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中的结构类型太多了,真晕,是否有方法不全部定义完,而只定义几个进行调试?
不知是哪里错了,若能跟踪一下DLL就好了