zoukankan      html  css  js  c++  java
  • 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);
            }
    

      

  • 相关阅读:
    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程( Win7 SQL Server2005 安装教程)
    PL/SQL -->隐式游标(SQL%FOUND)
    sql%found sql%notfound sql%rowcount sql%isopen
    C# WINFORM 窗体执行ORACLE存储过程 进行增删改查 自己编写借助网络(二)
    C# WINFORM 窗体执行ORACLE存储过程 进行增删改查 自己编写借助网络
    .net 接收存储过程的返回值 。。。。
    oracle-扫盲贴:存储过程实现增删改查
    sql加一个%号是什么意思
    关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值
    iOS网络请求之数据解析
  • 原文地址:https://www.cnblogs.com/datacool/p/datacool_2018_CSharp_Delphi.html
Copyright © 2011-2022 走看看