C#调用Delphi DLL获取字符串(C# IntPtr 与 string互转 )
前因后果
调用一门锁的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); }
相关文章
- C# String 前面不足位数补零的方法
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
- 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取
- C# IL DASM 使用-破解c#软件方法
- 【卷土重来之C#学习笔记】(二)c#编程概述
- Word控件Spire.Doc 【图像形状】教程(4) 用 C# 中的文本替换 Word 中的图像
- C#学习记录——博文目录
- c# 中HttpClient访问Https网站
- C#,数值计算,解微分方程的龙格-库塔四阶方法与源代码
- C#,码海拾贝(09)——阿克玛(Akima)曲线光滑插值算法,《C#数值计算算法编程》源代码升级改进版
- C#,入门教程(29)——修饰词静态(static)的用法详解
- String到底是值类型还是引用类型(C#)
- C#String.Split (string[], StringSplitOptions) 多参数分割得到数组
- C#连接池
- C# 往string [] arr 数组插入元素
- c# Mono.Cecil IL方式 读MethodBody
- 《C#零基础入门之百识百例》(六十一)结构体的定义 -- 时间设计
- C# CompareTo 和 String.Compare
- C# System.Threading.Timer如何停止
- C# WinForm实现窗体上控件自由拖动功能示例-OK
- C# VS常用操作