C#调用infoplus21_api.dll问题
哪位大哥/大姐使用C#调用过infoplus21_api.dll?实时数据库在另一台机器上。
我知道infoplus21_api.dll是用C/C++写的,调用的时候使用DllImport。
我的代码如下:
/// <summary>
/// 错误信息
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct ERRBLOCK
{
[MarshalAs(UnmanagedType.I2, SizeConst = 16)]
public short ERRCODE;
[MarshalAs(UnmanagedType.I8, SizeConst = 32)]
public long ERR1;
[MarshalAs(UnmanagedType.I8, SizeConst = 32)]
public long ERR2;
};
/// <summary>
/// 根据列名称返回列编号
/// </summary>
/// <param name="sFieldName">列名称</param>
/// <param name="iFieldNameLength">列名称长度</param>
/// <param name="iFieldId">列编号</param>
/// <param name="errors">错误信息</param>
[DllImport("infoplus21_api.dll", EntryPoint = "DECODFT", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void DECODFT(string sFieldName, short iFieldNameLength, ref int iFieldId, ref ERRBLOCK errors);
/// <summary>
/// 根据位号名称返回位号编号
/// </summary>
/// <param name="sRecordName">位号名称</param>
/// <param name="iRecordNameLength">位号名称长度</param>
/// <param name="iRecordId">位号编号</param>
/// <param name="errors">错误信息</param>
[DllImport("infoplus21_api.dll", EntryPoint = "DECODNAM", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void DECODNAM(string sRecordName, short iRecordNameLength, ref int iRecordId, ref ERRBLOCK errors);
/// <summary>
/// 连接数据库
/// </summary>
/// <returns>1连接成功,0连接不成功</returns>
[DllImport("infoplus21_api.dll", EntryPoint = "INISETC", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool INISETC();
/// <summary>
/// 断开数据库
/// </summary>
[DllImport("infoplus21_api.dll", EntryPoint = "ENDSETC", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void ENDSETC();
protected void Page_Load(object sender, EventArgs e)
{
if (INISETC())
{
myDiv.InnerHtml = "数据库连接成功!";
int iRecordId = 0;
int iFieldId = 0;
ERRBLOCK errors = new ERRBLOCK();
string sRecordName = "M_XTC_CJB_FIQ_F122_S";
string sFieldName = "Name";
DECODNAM(sRecordName, (short)(sRecordName.Length), ref iRecordId, ref errors); //4294967295
DECODFT(sFieldName, (short)(sFieldName.Length), ref iFieldId, ref errors);
myDiv.InnerHtml += (sRecordName + "编号:" + iRecordId.ToString() + " " + sFieldName + "编号:" + iFieldId.ToString());
ENDSETC();
}
else
{
myDiv.InnerHtml = "数据库连接失败";
}
}
//
我在调用INISETC()的时候总是返回1,即使我把网线断掉也返回1。
调用DECODNAM返回位号编号的时候总是返回-1,-1表示没有找到编号,而“M_XTC_CJB_FIQ_F122_S”这个位号是实时数据库中真实存在的。不知道那里出错了还是我的配置有问题。
那位大哥/大姐能帮助我? --------------------编程问答-------------------- 问题一大堆,怎么看不值给20分,你认为很简单? --------------------编程问答-------------------- 不知道简单不简单,我只是刚开始搞实时数据库IP21。关键是搞IP21的人太少了,在google和baidu上搜索一下很少关于用C#来做IP21二次开发的。 --------------------编程问答-------------------- 有人知道吗?搞IP21的人太少了? --------------------编程问答-------------------- 我知道。如果你用的是v7.1/v7.2/v7.3, 有一个叫IP21Access的assembly。你到c:\windows\assembly的地方去找。里面有所需的所有常用的C#调用。
我的电邮:fuelone@gmail.com
补充:.NET技术 , C#