针对使用C/C++版本的FaceId.dll
前提条件:
- 要求支持Unicode字符串的PowerBuilder版本(PowerBuilder 10支持Unicode)
- 下载安装Visual C++ Redistributable Packages for Visual Studio 2013
外部函数声明
FUNCTION ULong FaceId_Start(ref String Address, UInt Port, Int AddressFamily) LIBRARY "FaceId.dll" FUNCTION Long FaceId_SetSecretKey(ULong SocketHandle, String SecretKey) LIBRARY "FaceId.dll" FUNCTION ULong FaceId_GetSecretKey(ULong SocketHandle) LIBRARY "FaceId.dll" FUNCTION Long FaceId_Execute(ULong SocketHandle, String InBuffer, ref ULong hOutBuffer, ULong CodePage) LIBRARY "FaceId.dll" SUBROUTINE FaceId_Close(ULong SocketHandle) LIBRARY "FaceId.dll" 获取密码说明: ULong SecretKeyAddress=FaceId_GetSecretKey(SocketHandle) String SecretKey=String(SecretKeyAddress, "Address") 获取命令结果说明: 由于PowerBuilder函数String(data, {format})只能处理32767个字符,要获取完整命令结果,需要多次调用此函数。 假设ReceivedChars为FaceId_Execute的返回结果,且大于0,请通过如下方式获取完整命令结果 String Answer, DealedChars ULong hOutBuffer, Base Long ReceivedChars, Index IF SocketHandle = 0 THEN MessageBox('警告', '尚未连接设备!', StopSign!, OK!) RETURN END IF // 清空原有文本 mle_Answer.Text = '' ReceivedChars = FaceId_Execute(SocketHandle, sle_command.Text, ref hOutBuffer, 936) IF ReceivedChars > 0 THEN Index = 0 Base = hOutBuffer DO WHILE Index < ReceivedChars DealedChars = String(Base, "Address") Answer = Answer + DealedChars Index = Index + Len(DealedChars) Base = Base + Len(DealedChars)*2 LOOP mle_Answer.Text = Answer ELSE MessageBox('警告', '执行命令失败!', Exclamation!, OK!) END IF
C/C++头文件 FaceIdApi.h
#pragma once #include <Windows.h> #ifdef __cplusplus extern "C" { #endif /* 功能:开始与设备的通信 参数说明: Address:要连接的服务器IP地址 Port:要连接的服务器端口号 AddressFamily:地址族,支持AF_INET、AF_INET6、AF_UNSPEC,默认为AF_INET(IPv4) 返回值: 通信句柄,如果为NULL,则建立通信失败 说明: AF_INET = 2 AF_INET6 = 23 AF_UNSPEC = 0 */ HANDLE WINAPI FaceId_Start(const TCHAR* Address, UINT16 Port = 9922, INT AddressFamily = AF_INET); /* 功能:设置加密密钥 参数说明: SocketHandle:通信句柄 SecretKey:加密密钥。如果密钥为空,则密钥被清除 返回值: 错误代码 */ HRESULT WINAPI FaceId_SetSecretKey(HANDLE SocketHandle, const TCHAR* SecretKey = NULL); /* 功能:获取加密密钥 参数说明: SocketHandle:通信句柄 返回值: 如果密钥被清除,则返回值为NULL 如果密钥已激活,则返回密钥字符串指针 */ const TCHAR* WINAPI FaceId_GetSecretKey(HANDLE SocketHandle); /* 功能:向人脸通发送命令并获取返回的数据 参数说明: SocketHandle:通信句柄 InBuffer:要写入的命令字符串 hOutBuffer:接收字符串缓冲区句柄 CodePage:按指定的代码页进行宽字符和多字节之间的编码转换 返回值: >0:操作成功。读取到的字符数 =0:套接字已断开 SOCKET_ERROR:套接字错误。调用WSAGetLastError函数获取具体的错误信息 E_FAIL:设备返回失败 E_ACCESSDENIED:设备返回忙 E_ABORT:获取增强的网络数据通信流失败 E_UNEXPECTED:设备返回结果无法处理 其它:HRESULT类型错误 注意:如果该套接字再次执行读操作,原先返回的指针将会被污染(本身失效或者指向的内容失效) */ INT WINAPI FaceId_Execute(HANDLE SocketHandle, const TCHAR* InBuffer, OUT const TCHAR** hOutBuffer, UINT CodePage = 936); /* 功能:断开套接字连接 参数说明: SocketHandle:通信句柄 返回值: Windows Sockets Error Codes */ VOID WINAPI FaceId_Close(HANDLE SocketHandle); /* 功能:静态成员函数,将二进制数据转换为Base64编码字符串 参数说明: InBuffer:要编码的二进制数据 Count:要编码的字节数 OutBuffer:存储转换后的Base64编码字符串。如果为NULL,则函数返回转换后的有效字符个数 返回值: -1:参数错误 >=0:有效字符个数,不包括字符串结束符 注意: 结束数据时,OutBuffer的最小长度为(有效字符个数+1) 调用说明: 1.第一次调用设置OutBuffer为NULL,获取转换后的字符个数 2.申请指定长度(字符个数+1)的缓冲区接收数据 3.第二次调用设置OutBuffer为已申请好的缓冲区,接收数据 */ INT WINAPI Base64_Encode(const BYTE* InBuffer, INT Count, OUT OPTIONAL TCHAR* OutBuffer = NULL); /* 功能:将Base64编码字符串转换为二进制数据 参数说明: InBuffer:要解码的Base64编码字符串 Count:要解码的字符个数,应该为4的倍数。如果为-1,则自动计算字符串的长度 OutBuffer:输出缓冲区,用于存储转换后的二进制数据 返回值: -1:参数错误 -2:数据错误 >=0:转换后的字节数 调用说明: 1.第一次调用设置OutBuffer为NULL,获取转换后的字节长度 2.申请指定长度的缓冲区接收数据 3.第二次调用设置OutBuffer为已申请好的缓冲区,接收数据 */ INT WINAPI Base64_Decode(const TCHAR* InBuffer, INT Count, OUT OPTIONAL BYTE* OutBuffer = NULL); #ifdef __cplusplus } #endif