前因后果
调用一门锁的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);
}
|
请发表评论