酒店智能门锁sdk故障解决-酒店编码不一致,房卡无法开

酒店点门锁对接过程中,提示房卡写入成功,

反向读取数据显示正常

这是因为C#编码不一致导致

C#调用非托管的.dll文件方法如下:

复制代码
 [DllImport("未来之窗智能门锁.dll")  ]

        public static extern int GuestCard_原始(string 酒店编码, string 门锁编码, string 开房时间编码); 

在高版本会出错

解决方法

复制代码
 [DllImport("未来之窗智能门锁.dll", EntryPoint = "GuestCard",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)  
         ]
 
        public static extern int GuestCard_原始(string 酒店编码, string 门锁编码, string 开房时间编码); 

特别注意编码,一般C写的接口都是StdCall

其中CallingConvention.就有五种方式:

CallingConvention = CallingConvention.StdCall

CallingConvention = CallingConvention.Cdecl

CallingConvention = CallingConvention.FastCall

CallingConvention = CallingConvention.ThisCall

CallingConvention = CallingConvention.Win

看看原型

复制代码
#define   CALLBACK         __stdcall    
#define   WINAPI           __stdcall    
#define   WINAPIV          __cdecl    
#define   APIENTRY          WINAPI    
#define   APIPRIVATE       __stdcall    
#define   PASCAL           __stdcall

**调用约定总结** 调用约定决定了函数参数传送和栈操作的方式,主要有以下几种: 1. `__stdcall` 调用约定: - 相当于 16 位动态库中的 PASCAL 调用约定,在 32 位的 VC++5.0 中取代了 PASCAL 调用约定。 - 函数参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈。 - 函数名的修饰上,VC 编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。例如:`_functionname@num` 。 - 常用于 Win32 Api 中。 2. `__cdecl` 调用约定: - 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。 - 对于传送参数的内存栈由调用者维护,因此能实现可变参数的函数。 - 函数名修饰方面,VC 编译后会在函数名前面加上下划线前缀。 - 是 C 和 C++程序的缺省调用方式,也是 MFC 的缺省调用方式。 3. `__fastcall` 调用约定: - 主要特点是快,通过寄存器(ECX 和 EDX 传送前两个双字或更小的参数)和栈(剩下的参数自右向左压栈)传送参数。 - 被调用的函数在返回前清理传送参数的内存栈。 - 函数名修饰上,VC 编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。例如:`@functionname@num` 。 4. `thiscall` 调用约定: - 仅应用于"C++"成员函数,this 指针存放于 CX 寄存器,参数从右到左压。 5. `naked call` 调用约定: - 采用其他调用约定时,进入和退出函数时编译器会产生代码保存和恢复相关寄存器,而 `naked call` 不产生这样的代码。 在实际使用中,`__stdcall` 调用约定的函数由自身清栈,`__cdecl` 的函数由调用者清栈。最大的差别在于 `__cdecl` 的函数参数个数可以声明为不确定,如 `printf` 、`scanf` ;而 `__stdcall` 的函数不能这样做。 在 VC 中,`PASCAL` 、`CALLBACK` 、`WINAPI` 都等同于 `__stdcall` 。

这样就可以了

相关推荐
LawrenceLan2 分钟前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客27 分钟前
解析业务层的key冲突问题
开发语言·c++·分布式
明天好,会的28 分钟前
分形生成实验(五):人机协同破局--30万token揭示Actix-web状态管理的微妙边界
运维·服务器·前端
码不停蹄Zzz33 分钟前
C语言第1章
c语言·开发语言
C_心欲无痕1 小时前
nginx - alias 和 root 的区别详解
运维·前端·nginx
行者961 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon1 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio2 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词2 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go