调用一门锁的dll实现读取酒店IC卡数据,直接用Readme里的方法出错。

函数声明:

一、读卡函数
************************ Delphi 调用 *************************
* function DLL_Read:PChar;
external 'AnLock_2012.dll'; stdcall;
**************************************************************
*
************************* VB 调用 ****************************
* Private Declare Function DLL_Read Lib "AnLock_2012.dll" As String
*
**************************************************************
*
************************* PB 调用 ****************************
* Function String DLL_Read Library "AnLock_2012.dll";
**************************************************************
*
************************* C# 调用 ****************************
* [DllImport("AnLock_2012.dll", EntryPoint = "DLL_Read", CharSet = CharSet.None, SetLastError = false)]
*    public static extern String DLL_Read;
**************************************************************
**************************************************************
返回字符串格式说明:
|CardNo     卡号
|CardType   卡片类型
|Building   楼栋号
|Floor      楼层号
|RC         锁内号(门锁内定义的房间编号,与房间号一一对应)
|RN         房间号(若无关联房间号,则为锁内号)
|StartDT    入住时间
|EndDT      欲离时间
|OpenUnLock 可开反锁
|AlwaysOpen 常开门
|EndOldCard 终止前卡
**************************************************************

读卡返回值例子
例1: |CardNo3354970509|CardTypeGuestCard|RC1101|RN1101|StartDT20131209_00:00|EndDT20131214_00:00
以上读卡信息表示:
卡号为3354970509,卡片类型为GuestCard(宾客卡)
|RC1101|RN1101当不在门锁系统内锁内号与房号相等,一般只需处理|RC1101(锁内号)
|StartDT20131209_00:00|EndDT20131214_00:00 表示入住时间为2013年12月09号0点、退房时间2013年12月14号0点

[DllImport("ANLOCK_2012.dll", EntryPoint = "DLL_Read", CharSet = CharSet.None, SetLastError = false)]
        public static extern string DLL_Read();

分析和解决办法

delphi里导出string估计是使用的pchar,那么C#里面调用时取到是内存地址的句柄才对,试试用IntPtr来接收。一测试OK了。其实问题就是一句话:C# IntPtr与string的互转。

另外64位操作系统也会报错,解决办法就是编译生成的时候不要用AnyCPU,用x86。

正确的姿势:

        [DllImport("ANLOCK_2012.dll", EntryPoint = "DLL_Read", CharSet = CharSet.None, SetLastError = false)]
        public static extern IntPtr DLL_Read();
        public Form1()
            InitializeComponent();
        private void button1_Click(object sender, EventArgs e)
            var temp = DLL_Read();
            string ss = Marshal.PtrToStringAnsi(temp);
            textBox1.Text = ss;
            //最后释放掉
            //Marshal.FreeHGlobal(temp);
http://datacool.cnblogs.com
"专注于CMS(综合赋码系统),MES,WCS(智能仓储设备控制系统),WMS,商超,桑拿、餐饮、客房、足浴等行业收银系统的开发,15年+从业经验。因为专业,所以出色。"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++