哪位大哥/大姐使用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”这个位号是实时数据库中真实存在的。不知道那里出错了还是我的配置有问题。
那位大哥/大姐能帮助我?