前因后果

调用一门锁的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#调用Delphi DLL获取字符串(C# IntPtr 与 string互转 )的更多相关文章

  1. C#调用Delphi Dll返回字符串的示例(使用Move才能拷贝字符串)

    //----------------------Delphi------------------- procedure GetSqlData(ASource: PChar; ADest: PChar; ...

  2. vb6如何调用delphi DLL中的函数并返回字符串?

    1,问题描述 最近发现vb6调用delphi DLL中的函数并返回字符串时出现问题,有时正常,有时出现?号,有时干脆导致VB程序退出 -- :: 将金额数字转化为可读的语音文字:1转化为1元 ???? ...

  3. 在.net中调用Delphi dll的Pchar转换

    Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是De ...

  4. C# 调用Delphi dll

    delphi dll 源码: library dllres; type char10 = ..] of char; TMydata = packed record id: Integer; name: ...

  5. Visual Studio 调用 Delphi DLL 会退出的解决方案

    新写了一个 Delphi 的 dll 供 C# 程序调用,却发现在使用 Visual Studio 2012 进行调试时,程序会在调用后自动退出. 经过对比,只需要将工程属性中“调试”一页下的“启用 ...

  6. VC调用Delphi DLL

    别的没什么,是一定可以调用成功的.但是意外的是,ShowMessage函数在DLL里也可以轻易被调用.此外,Delphi里的var 相当于VC里的引用,需要在函数原型里正确标识,否则传递普通变量甚至常 ...

  7. Delphi DLL的创建、静态及动态调用

    转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...

  8. delphi dll创建及调用

    第一章 DLL简单介绍由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结.首先装简单介绍下DLL:1,减小可执行文件的大小DLL技术的产生有很大一部分原因是为了减小可执行文件的大小 ...

  9. [转]Delphi DLL的创建、静态 以及动态调用

    第一章  DLL简单介绍 由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结. 首先装简单介绍下DLL: 1,减小可执行文件的大小 DLL技术的产生有很大一部分原因是为了减小可执行 ...

随机推荐

  1. 第45章 工具 - Identity Server 4 中文文档(v1.0.0)

    该IdentityServerTools是为IdentityServer编写扩展代码时,你可能需要有效的内部工具的集合.要使用它,请将其注入代码,例如控制器: public MyController( ...

  2. 第1章 背景 - Identity Server 4 中文文档(v1.0.0)

    大多数现代应用程序或多或少看起来像这样: 最常见的互动是: 浏览器与Web应用程序通信 Web应用程序与Web API进行通信(Web应用程序自身 或 代表用户 与 Web API 通信) 基于浏览器 ...

  3. [PHP] foreach循环的引用赋值可能导致的问题

    foreach($arr as &$value)1.引用赋值符号&,是每次循环的时候,把当前元素变成地址,$value变量就是对应元素的地址,循环结束$value是一个指向最后一个元素 ...

  4. EditPlus提示错误:找不到或无法加载主类

    问题:EditPlus提示错误:找不到或无法加载主类. 原因:换了另外一台电脑,忘了什么时候,环境变量被误删了. 解决问题: 1.检查文件名和public修饰的类名是否一致. 2.文件查看时,有没有隐 ...

  5. C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...

  6. Java设计模式——适配器模式(Adapter)

    目的:把源类型适配为目标类型,以适应客户端(Client)的需求:此处我们把目标接口的调用方视为客户端 使用场景:需要对类型进行由源类型到目标类型转换的场景中 前置条件:已有客户端 //Client ...

  7. jQuery实现简单的图片淡入淡出效果

    整体思路: 1.实现页面布局,设置css样式 2.用jQuery获取需要用到的变量 3.用jQuery为两个按钮绑定事件 一.页面布局: <div class="d1"> ...

  8. 文件类型解析漏洞防御与攻击(PHP)

    简介: 解析漏洞主要是一些特殊文件被iis.Apache.Nginx等服务在某种情况下解释成脚本文件格式并得以执行而产生的漏洞,一般的思路都是用图片木马来欺骗服务器,上传webshell,达到提权的目 ...

  9. Dynamics 365权限变化大部署后需要注意什么?

    本人微信公众号:微软动态CRM专家罗勇 ,回复292或者20190110可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 如果 ...

  10. Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

    本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...