#pragma once #ifndef _DLL_INCLUDE_SYSAPI_H #define _DLL_INCLUDE_SYSAPI_H #include "syserr.h" /*-------宏定义,决定使用哪个平台*/ #ifndef _WINDOWS #define _WINDOWS #endif //#define __MAC //#define __LINUX /*--------宏定义结束------------*/ #ifdef _WINDOWS #include #include #include #include #pragma warning(disable: 4996) #else #include #include #endif #define RETURN_CHK_NOPRT(p, v) if (!(p)) \ {\ return (v); \ } #define ZERO_CHK(p) if (!(p)) \ { \ return; \ } //安全释放,并置空 #define FREE_ANY(p) if (0 != (p)) \ {\ delete (p);\ (p) = NULL;\ } //安全释放数组,并置空 #define FREE_ARRAY(p) if (0 != (p)) \ {\ delete [](p);\ (p) = NULL;\ } //安全删除一个timer #define Kill_Timer(p) if (-1 != (p)) \ {\ kill_timer(p);\ (p) = -1;\ } #define MAKEUL(r,h,l) { \ (r) = (h); \ (r) <<= 32; \ (r) |= l; \ } #define ZEROF 0.0000000001 //小于这个数认为等于0 //判断浮点数是否相等 #define EQUALF(x,y) (abs((x) - (y)) < ZEROF ? true : false) //判断浮点数是否为0 #define ISZEROF(x) (((x) < ZEROF && (x) > -ZEROF) ? true : false) #ifndef MAX #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1 /*-----------------------------socket定义--------------------------------*/ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif //这样定义方便在别的头文件重复定义 #ifndef _NO_DEF_TYPE #define ushort unsigned short #define uint unsigned int #define ulong unsigned long #define llong long long #define ullong unsigned long long #define uchar unsigned char #define cstr const char* #endif // typedef unsigned char uchar; // typedef unsigned short ushort; // typedef unsigned int uint; // typedef unsigned long ulong; // typedef long long llong; // typedef unsigned long long ullong; // typedef const char* cstr; //定义C++库函数 #ifdef _WINDOWS #define sys_stricmp _stricmp //#define sys_strtok strtok_s #else #define sys_stricmp strcasecmp //#define sys_strtok strsep #endif #define UINTMAX ((unsigned int)~((unsigned int)0)) #define INTMAX ((int)(UINTMAX >> 1)) #define INTMIN ((int)~INTMAX) #define MAX_NAME_LEN 32 #define MAX_IP_LEN 16 #define MAX_BUF_LEN 256 #define MAX_TIMEOUT 0xFFFFFFFF //无限等待 #define ANY_IP "0.0.0.0" //ip通用 #define NULL 0 #define INVALID_SKT (int)~0 //无效socket #define INVALID_HANDLE (Handle)-1 //无效句柄 #define INVALID_HANDLE_INT -1 //无效句柄 struct ST_SOCKADDR {//网络套接字 char ip[MAX_IP_LEN]; unsigned int port; int s; }; #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ /* * Types */ #define SOCK_STREAM 1 /* stream socket */ #define SOCK_DGRAM 2 /* datagram socket */ #define SOCK_RAW 3 /* raw-protocol interface */ #define SOCK_RDM 4 /* reliably-delivered message */ #define SOCK_SEQPACKET 5 /* sequenced packet stream */ /* * Protocols */ #define IPPROTO_IP 0 /* dummy for IP */ #define IPPROTO_ICMP 1 /* control message protocol */ #define IPPROTO_IGMP 2 /* group management protocol */ #define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ #define IPPROTO_TCP 6 /* tcp */ #define IPPROTO_PUP 12 /* pup */ #define IPPROTO_UDP 17 /* user datagram protocol */ #define IPPROTO_IDP 22 /* xns idp */ #define IPPROTO_ND 77 /* UNOFFICIAL net disk proto */ #define IPPROTO_RAW 255 /* raw IP packet */ /**************************************************** *Function: 初始化网络协议栈 *Intput: NULL *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_InitNet(); /**************************************************** *Function: 释放网络协议栈 *Intput: NULL *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_UninitNet(); /**************************************************** *Function: 通过ICMP协议检测一个远程IP是否接通 *Intput: remoteIP 远程IP地址 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_ChkNet(const char* remoteIP); /**************************************************** *Function: 创建一个TCP/UDP socket *Intput: af AF_INET 支持TCP UDP等通用协议 type 一般选择 SOCK_STREAM 流协议 protocol TCP为6 UDP为17,根据平台可能会不同 *Output: NULL *Return: 成功返回socket句柄,失败返回 INVALID_SKT ******************************************************/ EXPORT_C int WINAPI sys_Socket(int af, int type, int protocol); /**************************************************** *Function: 关闭一个socket *Intput: s socket句柄 *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_CloseSocket(int s); /**************************************************** *Function: 绑定一个socket到某个端口 *Intput: s socket句柄 lpIP ip地址 uPort 端口 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_Bind(int s, const char* lpIP, unsigned short uPort); /**************************************************** *Function: 监听一个服务端socket *Intput: s socket句柄 maxCnt 最大等待连接数量,同时连接时只支持 最大数量连接,比如最大为3,如果4个客户端 同时连接,会有一个失败,等其中一个连接ok, 再连就能成功 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_Listen(int s, int maxCnt); /**************************************************** *Function: 接受一个客户端连接,只支持服务端socket *Intput: s socket句柄 timeout 超时设置,默认永远等待 *Output: pclient 接受的客户端信息 包括通讯用的socket *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_Accept(int s, ST_SOCKADDR* pclient, int timeout = MAX_TIMEOUT); /**************************************************** *Function: 使用socket连接服务端 *Intput: s socket句柄 lpServer 服务端IP uPort 服务端端口 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_Connect(int s, const char* lpServer, unsigned short uPort); /**************************************************** *Function: 同步接收一个socket消息, 先select判断,再接收,否则阻塞 *Intput: s socket句柄 len 接收缓冲区大小 判断连接时 len = 0 *Output: NULL *Return: 成功返回接收到的字符串长度,失败返回错误码 *PS: 返回 ERR_NO_CONNECT 说明socket已经断开连接 ******************************************************/ EXPORT_C int WINAPI sys_Recv(int s, char* buf, int len); /**************************************************** *Function: 判断一组socket是否有消息可接收 *Intput: s socket句柄数组 count socket数组大小 len 接收缓冲区大小 判断连接时 len = 0 timeout 超时设置,默认永远等待 *Output: NULL *Return: 成功返回有消息触发的s索引,失败返回错误 ******************************************************/ EXPORT_C int WINAPI sys_Select(int* s, int count, int timeout = MAX_TIMEOUT); /**************************************************** *Function: 发送一个socket消息 *Intput: s socket句柄 buf 要发送的消息内容 len 要发送的内容大小 *Output: NULL *Return: 成功返回发送数据长度,失败返回错误码 *PS: 返回 ERR_NO_CONNECT 说明socket已经断开连接 ******************************************************/ EXPORT_C int WINAPI sys_Send(int s, const char* buf, int len); /**************************************************** *Function: 获取一个socket的相关信息(ip,port) *Intput: s socket句柄 *Output: paddr 获取的信息结构体缓冲区 *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_GetSockName(int s, ST_SOCKADDR* paddr); /**************************************************** *Function: 获取本地公网IP地址 *Intput: pszurl 可以获取到IP地址的网页实际地址 -- http://2017.ip138.com/ic.asp *Output: pszip 公网ip地址 *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_public_ips(const char* pszurl, char* pszip); /**************************************************** *Function: 获取本地所有IP地址, 返回数量 存入ips串, 以0分割 *Intput: NULL *Output: ips ip地址合集,以0分割 双0结尾 *Return: 成功返回获取到的ip数量,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_local_ips(char* ips); /**************************************************** *Function: UDP接收消息接口,同tcp一样,先select判断 *Intput: s socket句柄 buf 接收消息缓冲区 len 接收缓冲区大小 判断连接时 len = 0 ip 传出远端IP port 从哪个端口发来的? 传出远端发送端口 *Output: NULL *Return: 成功返回接收到的字符串长度,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_RecvFrom(int s, char* buf, int len, char* ip = 0, unsigned short* port = 0); /**************************************************** *Function: UDP发送消息接口 *Intput: s socket句柄 ip 要发送的ip 为NULL 时,广播消息 port 要发送的端口 buf 要发送的消息内容 len 要发送的内容大小 *Output: NULL *Return: 成功返回发送数据长度,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_SendTo(int s, const char* ip, unsigned short port, char* buf, int len); /*---------------------------socket定义结束------------------------------*/ typedef struct SYS_TIME {//时间结构体 unsigned short wYear; unsigned short wMonth; unsigned short wDayOfWeek; unsigned short wDay; unsigned short wHour; unsigned short wMinute; unsigned short wSecond; unsigned short wMilliseconds; } *LPSYS_TIME; enum SYS_FILE_ATTRIBUTE {//文件属性结构体 FATTRIBUTE_NORMAL = 0x01, //普通文件 FATTRIBUTE_COMPRESSED = 0x02, //压缩文件 FATTRIBUTE_HIDDEN = 0x04, //隐藏文件/目录 FATTRIBUTE_READONLY = 0x08, //只读文件/目录 FATTRIBUTE_DIRECTORY = 0x10, //目录,文件夹 }; typedef struct SYS_FIND_DATAA {//查找文件结构体 unsigned int dwFileAttributes; //文件属性 SYS_FILE_ATTRIBUTE一项或多项组合 SYS_TIME ftCreationTime; //创建时间 SYS_TIME ftLastAccessTime; //访问时间 SYS_TIME ftLastWriteTime; //最后修改时间 unsigned int nFileSizeHigh; unsigned int nFileSizeLow; unsigned int dwReserved0; unsigned int dwReserved1; char cFileName[MAX_BUF_LEN]; //只有文件名称,没有全路径 char cAlternateFileName[14]; #ifdef __MAC unsigned int dwFileType; unsigned int dwCreatorType; unsigned int wFinderFlags; #endif } *LPSYS_FIND_DATAA; //查找文件修改参数 enum EM_FILE_NOTIFY_OPTION { SYS_FILE_NOTIFY_CHANGE_NAME = 0x001, //文件名 SYS_FILE_NOTIFY_CHANGE_DIR_NAME = 0x002, //路径 SYS_FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004, //属性 SYS_FILE_NOTIFY_CHANGE_SIZE = 0x008, //大小 SYS_FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010, //最后修改时间 SYS_FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020, //最后读取、修改 SYS_FILE_NOTIFY_CHANGE_CREATION = 0x040, //创建时间 SYS_FILE_NOTIFY_CHANGE_SECURITY = 0x100, //访问权限 }; typedef void* Handle; typedef int (WINAPI *PROCEX)(void* param); typedef int (WINAPI *FUN)(); /**************************************************** *Function: 创建一个普通线程 *Intput: lpStartAddress 线程执行函数地址 lpParameter 执行函数附加参数 pid 若需要传回线程ID,可传入 *Output: NULL *Return: 返回线程句柄,失败返回 INVALID_HANDLE ******************************************************/ EXPORT_C Handle WINAPI sys_CreateThread(PROCEX lpStartAddress, void* lpParameter, int* pid = 0); /**************************************************** *Function: 获取当前线程ID *Intput: NULL *Output: NULL *Return: 返回当前线程ID ******************************************************/ EXPORT_C int WINAPI sys_GetCurrentThreadId(); /**************************************************** *Function: 挂起一个线程 *Intput: hThread 线程句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_SuspendThread(Handle hThread); /**************************************************** *Function: 恢复一个线程,挂起时才能使用 *Intput: hThread 线程句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_ResumeThread(Handle hThread); /**************************************************** *Function: 强制终止一个线程 *Intput: hThread 线程句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_TerminateThread(Handle hThread); /**************************************************** *Function: 创建一个事件 *Intput: bManualReset 是否为手动设置信号,自动模式,则等待到信号自动置为无信号 bInitialState 初始信号 lpName 事件名称,可以为NULL,垮进程调用时,应该设置为有名事件 *Output: NULL *Return: 返回事件句柄,失败返回 INVALID_HANDLE ******************************************************/ EXPORT_C Handle WINAPI sys_CreateEvent(int bManualReset, int bInitialState, const char* lpName); /**************************************************** *Function: 打开一个命名事件,实现进程间通信 *Intput: lpName 事件名称 *Output: NULL *Return: 返回事件句柄,失败返回 INVALID_HANDLE ******************************************************/ EXPORT_C Handle WINAPI sys_OpenEvent(const char* lpName); /**************************************************** *Function: 等待一个事件有信号 *Intput: hHandle 事件句柄 dwMilliseconds 等待时间,单位ms TIME_MAX 为无限等待 lpName 事件名称,可以为NULL,垮进程调用时,应该设置为有名事件 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_WaitForSingleObject(Handle hHandle, unsigned int iMilliseconds = MAX_TIMEOUT); /**************************************************** *Function: 等待多个事件有信号, 有信号时,返回最小 索引值的event,不返回的可以继续调用sys_WaitForMultipleObjects 等待,直到没有信号为止 *Intput: nCount 事件数组大小 lpHandle 事件数组首地址 bWaitAll 是否等待所有事件有信号 0 表示不是 dwMilliseconds 等待时间,单位ms TIME_MAX 为无限等待 *Output: NULL *Return: 成功返回数组中有信号的最小索引值,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_WaitForMultipleObjects(unsigned int nCount, const Handle* lpHandle, int bWaitAll, unsigned int dwMilliseconds = MAX_TIMEOUT); /**************************************************** *Function: 设置一个事件为有信号 *Intput: hEvent 事件句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_SetEvent(Handle hEvent); /**************************************************** *Function: 设置一个事件为无信号 *Intput: hEvent 事件句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_ResetEvent(Handle hEvent); /**************************************************** *Function: 设置一个事件为无信号 *Intput: hEvent 事件句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_CloseHandle(Handle hObject); /**************************************************** *Function: 创建一个互斥量,基于进程间的 *Intput: bInitialOwner 是否标识自己为所有者 0为假 lpName 互斥量名称 *Output: NULL *Return: 返回互斥量事件句柄 ******************************************************/ EXPORT_C Handle WINAPI sys_CreateMutex(int bInitialOwner, const char* lpName); /**************************************************** *Function: 打开一个互斥量,基于进程间的 *Intput: bInitialOwner 是否标识自己为所有者 0为假 lpName 互斥量名称 *Output: NULL *Return: 返回互斥量事件句柄 ******************************************************/ EXPORT_C Handle WINAPI sys_OpenMutex(int bInitialOwner, const char* lpName); /**************************************************** *Function: 释放一个互斥量 *Intput: bInitialOwner 是否标识自己为所有者 0为假 lpName 互斥量名称 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_ReleaseMutex(Handle hMutex); /**************************************************** *Function: 初始化一个临界区,跨线程同步用 *Intput: NULL *Output: NULL *Return: 返回一个句柄 ******************************************************/ EXPORT_C Handle WINAPI sys_InitializeCriticalSection(); /**************************************************** *Function: 删除临界区句柄 *Intput: hSection 互斥量句柄 *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_DeleteCriticalSection(Handle hSection); /**************************************************** *Function: 进入临界区 *Intput: hSection 互斥量句柄 *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_EnterCriticalSection(Handle hSection); /**************************************************** *Function: 离开临界区 *Intput: hSection 互斥量句柄 *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_LeaveCriticalSection(Handle hSection); /**************************************************** *Function: 动态加载一个dll *Intput: lpLibFileName 模块名包括.dll *Output: NULL *Return: 返回一个模块句柄, 失败返回 INVALID_HANDLE ******************************************************/ EXPORT_C Handle WINAPI sys_LoadLibrary(const char* lpLibFileName); /**************************************************** *Function: 释放一个模块 *Intput: hLibModule 模块句柄 *Output: 无 *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_FreeLibrary(Handle hLibModule); /**************************************************** *Function: 获取一个模块中的函数接口地址 *Intput: hModule 模块句柄 lpProcName 函数名 *Output: NULL *Return: 成功返回函数地址,失败返回空 ******************************************************/ EXPORT_C FUN WINAPI sys_GetProcAddress(Handle hModule, const char* lpProcName); /**************************************************** *Function: 使当前线程休眠一段时间 *Intput: dwMilliseconds 休眠时间 单位ms *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_Sleep(unsigned int dwMilliseconds); /**************************************************** *Function: 获取CPU时钟计时器 *Intput: NULL *Output: NULL *Return: 返回当前CPU时钟 单位: ms ******************************************************/ EXPORT_C unsigned long WINAPI sys_GetTickCount(); /**************************************************** *Function: 获取CPU高精度时钟计时器 *Intput: NULL *Output: NULL *Return: 返回当前CPU时钟 精确倒1um 单位: ms ******************************************************/ EXPORT_C double WINAPI sys_GetMilliseconds(); /**************************************************** *Function: 获取本地时间 *Intput: lpSysTime 时间结构体 *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI sys_GetLocalTime(SYS_TIME* lpSysTime); /**************************************************** *Function: 获取CPU序列号 -- 保证传入大于32字节 *Intput: lpSN CPU序列号 lpLow 低位 -- 可以不传 *Output: lpSN CPU序列号 *Return: 成功返回1,失败返回0 ******************************************************/ EXPORT_C int WINAPI sys_GetCPUSerialNo(char* lpSN, char* lpLow = 0); /**************************************************** *Function: 获取第一个硬盘序列号 -- 保证传入大于32字节 *Intput: lpSN 硬盘序列号 *Output: lpSN 硬盘序列号 *Return: 成功返回1,失败返回0 ******************************************************/ EXPORT_C int WINAPI sys_GetFirstHDSerial(char* lpSN); /**************************************************** *Function: 获取所有硬盘序列号 *Intput: lpSN 硬盘序列号 *Output: lpSN 硬盘序列号 序列号之间以'\0'间隔开 *Return: 成功返回硬盘数量,失败返回错误代码<0 *PS: 先传入NULL获取数量,再传入数量*32字节大小获取内容 ******************************************************/ EXPORT_C int WINAPI sys_GetAllHDSerial(char* lpSN = 0); /**************************************************** *Function: 查找硬盘序列号是否存在 *Intput: lpSN 硬盘序列号 *Output: NULL *Return: 存在返回1,不存在返回0 ******************************************************/ EXPORT_C int WINAPI sys_FindHDSerial(const char* lpSN); /**************************************************** *Function: 获取第一个网卡mac地址 -- 保证传入大于12字节 *Intput: lpMac 网卡mac地址 *Output: lpMac 网卡mac地址 *Return: 成功返回1,失败返回0 ******************************************************/ EXPORT_C int WINAPI sys_GetFirstMacAddr(char* lpMac); /**************************************************** *Function: 获取所有网卡mac地址 *Intput: lpMac 网卡mac地址 *Output: lpMac 网卡mac地址 序列号之间以'\0'间隔开 *Return: 成功返回网卡数量,失败返回错误代码<0 *PS: 先传入NULL获取数量,再传入数量*12字节大小获取内容 ******************************************************/ EXPORT_C int WINAPI sys_GetAllMacAddr(char* lpMac = 0); /**************************************************** *Function: 查找网卡mac地址是否存在 *Intput: lpMac 网卡mac地址 *Output: NULL *Return: 存在返回1,不存在返回0 ******************************************************/ EXPORT_C int WINAPI sys_FindMacAddr(const char* lpMac); //---文件操作--- enum SYS_FILE_ACESS {//文件访问方式 FGENERIC_READ = 0x01, //读取 可与 SYS_GENERIC_WRITE 或操作 FGENERIC_WRITE = 0x02, //写入 可与 SYS_GENERIC_READ 或操作 }; enum SYS_FILE_OPEN {//文件打开方式 SYS_CREATE_NEW = 1, //创建一个新的文件,若存在则失败 SYS_CREATE_ALWAYS = 2, //创建一个新的文件,若存在则覆盖 SYS_OPEN_EXISTING = 3, //打开一个已经存在的文件,若不存在,则失败 SYS_OPEN_ALWAYS = 4, //打开一个已经存在的文件,若不存在,则创建 SYS_TRUNCATE_EXISTING = 5, //打开一个已经存在的文件并置空,若不存在,则失败 }; /**************************************************** *Function: 获取系统配置项 -- 直接读取文件 *Intput: key 段落名 [xxx] <32字节 name 关键字 xxx=? <32字节 *Output: pszval 配置值 -- 保证传入256个字节 *Return: 成功返回0,失败返回错误码 *PS: 此接口可能需要管理员权限 ******************************************************/ EXPORT_C int WINAPI sys_GetConfig(const char* key, const char* name, char* pszval); /**************************************************** *Function: 设置系统配置项 -- 直接写入文件 *Intput: key 段落名 [xxx] <32字节 name 关键字 xxx=? <32字节 *Output: pszval 配置值 -- <256字节 *Return: 成功返回0,失败返回错误码 *PS: 此接口可能需要管理员权限 ******************************************************/ EXPORT_C int WINAPI sys_SetConfig(const char* key, const char* name, const char* pszval); /**************************************************** *Function: 获取当前exe/dll所在绝对路径 *Intput: lpPath 路径缓冲区 *Output: lpPath 路径缓冲区 *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_GetCurrentPath(char* lpPath); /**************************************************** *Function: 创建一个文件,可用于串口,及文件操作 *Intput: lpFileName 文件名 dwAccess 访问方式 参考 SYS_FILE_ACESS dwCreationOption 打开方式,参考 SYS_FILE_OPEN *Output: NULL *Return: 成功返回文件句柄,失败返回 INVALID_HANDLE ******************************************************/ EXPORT_C Handle WINAPI sys_CreateFile(const char* lpFileName, unsigned int dwAccess, unsigned int dwCreationOption); /**************************************************** *Function: 往一个已经打开的文件写数据 *Intput: hFile 文件句柄 lpBuffer 待写入数据 nBufLen 待写入数据大小 *Output: NULL *Return: 成功返回写入的长度,失败返回错误码<0 ******************************************************/ EXPORT_C int WINAPI sys_WriteFile(Handle hFile, const void* lpBuffer, unsigned int nBufLen); /**************************************************** *Function: 从一个已经打开的文件读数据 *Intput: hFile 文件句柄 lpBuffer 数据缓冲区 nBufSize 缓存区大小 *Output: NULL *Return: 成功返回读取的长度,失败返回错误码<0 ******************************************************/ EXPORT_C int WINAPI sys_ReadFile(Handle hFile, void* lpBuffer, unsigned int nBufSize); /**************************************************** *Function: 获取文件的创建时间、修改时间 *Intput: lpFileName 文件详细路径 lpCreate 创建时间 可以传NULL lpAccess 最后访问时间 可以传NULL lpWrite 最后修改时间 可以传NULL *Output: NULL *Return: 成功返回0,失败返回错误码<0 ******************************************************/ EXPORT_C int WINAPI sys_GetFileTime(const char* lpFileName, SYS_TIME* lpCreate, SYS_TIME* lpAccess, SYS_TIME* lpWrite); /**************************************************** *Function: 设置文件的创建时间、修改时间 *Intput: lpFileName 文件详细路径 lpCreate 创建时间 可以传NULL lpAccess 最后访问时间 可以传NULL lpWrite 最后修改时间 可以传NULL *Output: NULL *Return: 成功返回0,失败返回错误码<0 ******************************************************/ EXPORT_C int WINAPI sys_SetFileTime(const char* lpFileName, SYS_TIME* lpCreate, SYS_TIME* lpAccess, SYS_TIME* lpWrite); /**************************************************** *Function: 删除一个文件 *Intput: lpFileName 文件详细路径 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_DeleteFile(const char* lpFileName); /**************************************************** *Function: 获取一个文件的属性 *Intput: lpFileName 文件详细路径 *Output: NULL *Return: 成功返回一个整型属性值,失败返回错误码 *PS 返回值类型请参考 SYS_FILE_ATTRIBUTE 可能是一个或多个的或值 ******************************************************/ EXPORT_C int WINAPI sys_GetFileAttribute(const char* lpFileName); /**************************************************** *Function: 获取磁盘空间大小 *Intput: lpDirName 驱动器路径 如:"C:" "D:" *Output: lpTotal 磁盘总大小 单位:字节 不获取可不传入 lpFree 磁盘可用空间大小 单位:字节 不获取可不传入 *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI sys_GetDiskSpace(const char* lpDirName, unsigned long long* lpTotal = 0, unsigned long long* lpFree = 0); /**************************************************** *Function: 查找第一个文件 *Intput: lpFileName 文件/目录/通配符*.ini *Output: pFindData 返回查找到的文件结构体 *Return: 成功返回一个文件句柄,失败返回INVALID_HANDLE *PS: 使用完该句柄后调用 sys_FindClose 关闭句柄 ******************************************************/ EXPORT_C Handle WINAPI sys_FindFirstFile(const char* lpFileName, LPSYS_FIND_DATAA pFindData); /**************************************************** *Function: 查找当前目录下一个文件 *Intput: hFindFile 由sys_FindFirstFile 创建句柄 *Output: pFindData 返回查找到的文件结构体 *Return: 成功返回TRUE(1) 失败返回FALSE(0) ******************************************************/ EXPORT_C int WINAPI sys_FindNextFile(Handle hFindFile, LPSYS_FIND_DATAA pFindData); /**************************************************** *Function: 关闭文件查找句柄 *Intput: hFindFile 由sys_FindFirstFile 创建句柄 *Output: NULL *Return: 成功返回TRUE(1) 失败返回FALSE(0) ******************************************************/ EXPORT_C int WINAPI sys_FindClose(Handle hFindFile); //----------------------------------系统api定义结束----------------------------------// /**************************************************** *Function: 把一段utf8编码字符串转换为gbk编码 *Intput: utf8 需要转换的utf8字符串 datalen gbk字符串容量 *Output: gbk 转换后的gbk字符串 *Return: NULL ******************************************************/ EXPORT_C void WINAPI utf8_to_gbk(const char* utf8, wchar_t* gbk, int datalen); /**************************************************** *Function: 把一段gbk编码字符串转换为utf8编码 *Intput: gbk 需要转换的gbk字符串 datalen utf8字符串容量 *Output: utf8 转换后的utf8字符串 *Return: NULL ******************************************************/ EXPORT_C void WINAPI gbk_to_utf8(const wchar_t* gbk, char* utf8, int datalen); /**************************************************** *Function: 把一段gbk编码字符串转换为ascii编码 *Intput: gbk 需要转换的gbk字符串 datalen ascii 字符串容量 *Output: ascii 转换后的ascii字符串 *Return: NULL ******************************************************/ EXPORT_C void WINAPI gbk_to_ascii(const wchar_t* gbk, char* ascii, int datalen); /**************************************************** *Function: 把一段ascii编码字符串转换为gbk编码 *Intput: ascii 需要转换的ascii字符串 datalen gbk字符串容量 *Output: gbk 转换后的gbk字符串 *Return: NULL ******************************************************/ EXPORT_C void WINAPI ascii_to_gbk(const char* ascii, wchar_t* gbk, int datalen); /**************************************************** *Function: 查找某usb设备是否存在 *Intput: keywork 查找关键字(硬件ID) *Output: NULL *Return: 成功返回1 失败返回0 ******************************************************/ EXPORT_C int WINAPI search_usb_dev(const char* keywork); /**************************************************** *Function: 拷贝一个字符串到剪贴板 *Intput: pbuff 字符串 *Output: NULL *Return: 成功返回0 失败返回错误码 ******************************************************/ EXPORT_C int WINAPI copy_to_board(const char* pbuff); /**************************************************** *Function: 获取当前程序所在目录的根目录 -- "D:" "E:" *Intput: NULL *Output: NULL *Return: 成功返回根目录, 失败返回NULL ******************************************************/ EXPORT_C const char* WINAPI get_root_path(); /**************************************************** *Function: 创建一个文件夹,若存在,则不创建 *Intput: path 文件夹全路径 *Output: NULL *Return: 成功返回0, 失败返回错误码 *PS: 此接口可自动创建多层目录 ******************************************************/ EXPORT_C int WINAPI create_path(const char* path); /***************************************************** *Function: 递归删除一个文件夹 *Intput: filepath 需要检测的文件全路径 *Output: NULL *Return: 成功返回0, 失败返回错误码 *PS: 此接口可删除目标目录下所有子目录及文件 ******************************************************/ EXPORT_C int WINAPI delete_path(const char* path); /**************************************************** *Function: 判断一个文件/文件夹是否存在 *Intput: filepath 需要检测的文件全路径 *Output: NULL *Return: 存在返回1, 否则返回0 ******************************************************/ EXPORT_C int WINAPI is_file_exist(const char* filepath); /**************************************************** *Function: 判断一个文件是否只读 *Intput: filepath 需要检测的文件全路径 *Output: NULL *Return: 只读返回1, 否则返回0 ******************************************************/ EXPORT_C int WINAPI is_file_read_only(const char* filepath); /**************************************************** *Function: 获取一个文件的大小 *Intput: filepath 需要检测的文件全路径 *Output: NULL *Return: 返回文件大小>=0 ******************************************************/ EXPORT_C unsigned long long WINAPI get_file_size(const char* filepath); //若需要获取拷贝进度,请实现本接口 //progress 当前进度 -- 百分比 //pszname 当前正在拷贝的文件路径 //其中一个参数发生变化时就会回调 //返回FALSE会中断拷贝,返回TRUE继续拷贝 //*PS: 拷贝单个文件回调时,pszname会传NULL typedef int (WINAPI *COPYPROC)(int progress, const char* pszname); /**************************************************** *Function: 复制一个文件 *Intput: file 原文件夹路径 newfile 新文件夹路径 pcall 进度回调函数,若传入参数,则会自动回调 *Output: NULL *Return: 成功返回0, 失败返回错误码 ******************************************************/ EXPORT_C int WINAPI copy_file(const char* file, const char* newfile, COPYPROC pcall = NULL); /**************************************************** *Function: 递归复制一个文件夹所有内容到另外一个文件夹 *Intput: src 源目标文件夹路径 des 拷贝到哪?目的地路径 pext 扩展名 "txt or dat" -- 为空则全部拷贝 pcall 进度回调函数,若传入参数,则会自动回调 *Output: NULL *Return: 成功返回0, 失败返回错误码 *PS:阻塞操作,可能执行会比较久 ******************************************************/ EXPORT_C int WINAPI copy_path(const char* src, const char* des, const char* pext = NULL, COPYPROC pcall = NULL); enum EMStrType {//字符串类型 EMSTR_STRING = 0, //字符串 EMSTR_INT, //整型 EMSTR_DOUBLE, //浮点型 }; /**************************************************** *Function: 获取一个字符串类型 *Intput: pstr 待检测字符串 count 要检测的字符数量 为0时检测全部 *Output: NULL *Return: double返回2 整数返回1, 其它返回0 参考EMStrType ******************************************************/ EXPORT_C int WINAPI get_str_type(const char* pstr, int count = 0); /**************************************************** *Function: 删除一个字符串前后两头的特殊字符(逐字符比较) *Intput: pbuff 待处理字符串 key 特殊字符数组 *Output: NULL *Return: NULL ******************************************************/ EXPORT_C void WINAPI trim_char(char* pbuff, const char* key = " "); /**************************************************** *Function: 将一段数据内容向前移动step个字节单位内存重新存储,必须保证指针有效性 *Intput: psrc 当前数据内容首地址 nsize 移动内容长度 -- 不能为0,若为字符串,nsize必须包含结束符 step 移动大小 -- 不能为0 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI mem_forward(void* psrc, unsigned int nsize, unsigned int step); /**************************************************** *Function: 将一段数据内容向后移动step个字节单位内存重新存储,必须保证指针有效性 *Intput: psrc 当前数据内容首地址 nsize 移动内容长度 -- 不能为0,若为字符串,nsize必须包含结束符 step 移动大小 -- 不能为0 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI mem_backward(void* psrc, unsigned int nsize, unsigned int step); /**************************************************** *Function: 查找一个字符串中有多少个指定的字符 *Intput: src 目标字符串 ch 指定字符 *Output: NULL *Return: 返回查找到的指定字符个数 ******************************************************/ EXPORT_C int WINAPI get_char_cnt(const char* src, char ch); /**************************************************** *Function: 获取当前exe/dll所在绝对路径 *Intput: NULL *Output: NULL *Return: 返回当前exe/dll所在绝对路径 不会为空 ******************************************************/ EXPORT_C const char* WINAPI get_cur_path(); /**************************************************** *Function: 切割字符串 功能类似于strtok *Intput: src 目标字符串,_Context非空时,src可传入NULL _Delim 分割字符串,字符串 *_Context 目标字符串,src非空时,*_Context无意义 *Output: _Context 切割后剩余的字符串地址指针 *Return: 返回切割后的字符串,没有另外申请内存,不需要释放 *与strtok的区别: 1. 当切割符出现在首部时,返回NULL,strtok会直到出现有效字符为止进行切割 2. _Delim是字符串全匹配模式,strtok是_Delim任意一个字节匹配就可以切割 ******************************************************/ EXPORT_C char* WINAPI sys_strtok(char* src, const char* _Delim, char** _Context); /**************************************************** *Function: 拷贝目标字符串,直到结束或者找到指定字符 *Intput: src 目标字符串 dest待拷贝字符串 ch 指定字符 *Output: NULL *Return: 返回结束的指针地址(src+strlen(dest)),指向0结束符 ******************************************************/ EXPORT_C char* WINAPI comm_strcpy(char* src, const char* dest, char ch = 0); /**************************************************** *Function: 拷贝指定数量目标字符串,直到结束或者找到指定字符 *Intput: src 目标字符串 dest待拷贝字符串 len 指定最多拷贝多少个字节 包含最后一个0结束符 ch 指定结束字符 *Output: NULL *Return: 返回结束的指针地址(src+strlen(dest)),指向0结束符 ******************************************************/ EXPORT_C char* WINAPI comm_strncpy(char* src, const char* dest, unsigned int len, char ch = 0); /**************************************************** *Function: double转换成int *Intput: f 双精度类型double *Output: NULL *Return: 返回int值 预防整数出现0.9999999然后取整 ******************************************************/ EXPORT_C int WINAPI double_to_int(double f); /**************************************************** *Function: 某个字符串中取N位转化成数字 *Intput: pstr 源字符串 ncount 取多少个字符 *Output: NULL *Return: 返回int值,有非数字值时返回0 ******************************************************/ EXPORT_C int WINAPI atoni(const char* pstr, int ncount); /**************************************************** *Function: 比较日期1到日期2需要几天,格式:"20080902" *Intput: date1 日期1 date2 日期2 *Output: NULL *Return: 返回int值,有非数字值时返回0 ******************************************************/ EXPORT_C int WINAPI datecmp(const char* pdate1, const char* pdate2); /**************************************************** *Function: 分割一个全路径为路径+文件名 *Intput: fullPath 全路径名 *Output: szPath 文件所在路径 szFile 文件名,取决于全路径是否包含".", 若不包含则字符串为空 *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI token_full_path(const char* fullPath, char* szPath = 0, char* szFile = 0); /**************************************************** *Function: 检查一个IP地址是否合法 *Intput: lpIP ip地址字符串 *Output: NULL *Return: ip地址合法返回1 不合法返回0 ******************************************************/ EXPORT_C int WINAPI chk_ipaddress(const char* lpIP); /**************************************************** *Function: 计算指定数据CRC32校验码 *Intput: src 目标数据 len 目标数据大小, 按字节算 *Output: NULL *Return: 返回CRC32校验码 ******************************************************/ EXPORT_C unsigned int WINAPI crc32(const void* src, int len); /**************************************************** *Function: 对指定字符串增加BCC校验码 *Intput: src 目标字符串 high 校验位高4位 -- 可以传NULL low 校验位低4位 -- 可以传NULL *Output: high,low *Return: 返回增加BCC校验位后的字符串长度 *PS: 若high参数传入空,则会自动在字符串后面增加2个字节 的校验位,高位在前,低位在后.并返回字符串长度+2 ******************************************************/ EXPORT_C int WINAPI bcc(char* src, char* high = 0, char* low = 0); /**************************************************** *Function: 判断指定字符串BCC校验码是否正确 *Intput: src 目标字符串 *Output: NULL *Return: 成功返回1,失败返回0 ******************************************************/ EXPORT_C int WINAPI bcc_check(char* src); /**************************************************** *Function: 对字符串进行加密 *Intput: des 目标字符串 key 加密秘钥 -- 根据秘钥加密 最长16位 *Output: src -- 加密后的缓冲区//字符串 *Return: 返回加密后的字符串长度 ******************************************************/ EXPORT_C int WINAPI encrypt_str(char *src, const char *des, const char *key); /**************************************************** *Function: 对已经加密的字符串进行解密 *Intput: des 目标字符串 -- 必须是32位的倍数 key 解密秘钥 -- 使用加密时用的秘钥 最长16位 *Output: src -- 解密后的缓冲区//字符串 *Return: 成功返回0 ,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI decrypt_str(char *src, const char *des, const char *key); /**************************************************** *Function: 对一个32位整数进行加密 *Intput: des 要加密的数字 key 加密秘钥 *Output: NULL *Return: 返回加密后的整数 ******************************************************/ EXPORT_C int WINAPI encrypt_int(int des, int key = 0); /**************************************************** *Function: 对已经加密的32位整数进行解密 *Intput: des 要解密的数字 key 解密秘钥 -- 使用加密时用的秘钥 *Output: NULL *Return: 返回解密后的整数 ******************************************************/ EXPORT_C int WINAPI decrypt_int(int des, int key = 0); /**************************************************** *Function: 对一个8位整数进行加密 *Intput: des 要加密的数字 key 加密秘钥 *Output: NULL *Return: 返回加密后的整数 -- 8位 ******************************************************/ EXPORT_C unsigned char WINAPI encrypt_char(unsigned char des, unsigned char key = 0); /**************************************************** *Function: 对已经加密的8位整数进行解密 *Intput: des 要解密的数字 key 解密秘钥 -- 使用加密时用的秘钥 *Output: NULL *Return: 返回解密后的整数 -- 8位 ******************************************************/ EXPORT_C unsigned char WINAPI decrypt_char(unsigned char des, unsigned char key = 0); /**************************************************** *Function: 初始化线程池 *Intput: NULL *Output: NULL *Return: 成功返回0 ,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI init_pool(); /**************************************************** *Function: 关闭线程池 *Intput: NULL *Output: NULL *Return: 成功返回0 ,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI uninit_pool(); /**************************************************** *Function: 使用线程池执行一个函数 *Intput: fun 函数地址 lparam 任意型指针 *Output: NULL *Return: 成功返回线程ID,失败返回错误码<0 *PS: 为了提高效率,线程池只是用来运行重复效率高,时间短的工作 ******************************************************/ EXPORT_C int WINAPI pool_thread(PROCEX fun, void* lparam); /**************************************************** *Function: 初始化timer线程 *Intput: NULL *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI init_timer(); /**************************************************** *Function: 关闭timer线程 *Intput: NULL *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI deinit_timer(); //timer回调函数接口类型声明,使用公共计时器循环执行时,实现此接口并注册 /* tid -- 计时器ID lparam -- 注册对象指针*/ typedef void (WINAPI *TimerFun)(int tid, void* lparam); /**************************************************** *Function: 设置一个timer定时器工作任务 -- 辅助主线程 *Intput: fun 回调接口 nElapse 运行间隔 > 0 && < 5000 lparam 回调附加参数 *Output: 无 *Return: 成功返回定时器ID>0,失败返回错误代码<0 PS: 自定义timer由子线程运行,若要更新UI,最好postmessage 到主窗口,否则可能会发生内存访问互斥 ******************************************************/ EXPORT_C int WINAPI set_timer(TimerFun fun, int nElapse = 100, void* lparam = 0); /**************************************************** *Function: 删除一个timer,所有timer删除完,线程才会退出 *Intput: tid 定时器ID *Output: 无 *Return: NULL ******************************************************/ EXPORT_C void WINAPI kill_timer(int tid); //注册底层消息机制 enum MessageType {//消息类型 MSG_NORMAL = 0, //提示消息框 -- OK MSG_SELECT, //选择消息框 -- 是+否 MSG_RETRY, //重试消息框 -- 重试+忽略+取消 / 自定义 备用 MSG_WARN, //警告消息框 -- OK MSG_ERR, //错误消息框 -- OK MSG_ASCII, //字符串消息 MSG_EXITSYS, //退出系统 MSG_RESTART, //重启系统 }; enum MessageResult {//回调消息返回结果 IDR_OK = 0, //ok IDR_CANCEL, //取消 IDR_ABORT, //忽略 IDR_RETRY, //重试 IDR_YES, //选择是 IDR_NO, //选择否 IDR_CUS, //自定义 备用 }; typedef MessageResult (WINAPI *FunMessageShow)(const char*, MessageType, void*); /**************************************************** *Function: 注册消息弹窗提示,注册后可显示底层提示消息,一般ui层注册 *Intput: fun 回调函数地址 param 附加参数 *Output: NULL *Return: 成功返回0, 失败返回错误码 *PS: 在程序初始化时注册,支持最多注册两次,最后注册作为主要回调接口 ******************************************************/ EXPORT_C int WINAPI regist_message(FunMessageShow fun, void* param); /**************************************************** *Function: 反注册消息弹窗提示,反注册后会返回到上一次注册状态 *Intput: fun 回调函数地址 *Output: NULL *Return: 成功返回0, 失败返回错误码 *PS: 在程序退出时反注册,反注册时优先释放主要回调接口,使用备用接口 ******************************************************/ EXPORT_C int WINAPI unregist_message(FunMessageShow fun); /**************************************************** *Function: 同步回调消息,注册后可接收,一般用于UI注册接收,底层发送 *Intput: type 消息类型 MessageType pszFormat 提示消息内容或格式 长度<1024 ... 可变参数 *Output: NULL *Return: 成功返回消息返回值(MessageResult),失败返回错误码(<0) *PS: 支持多线程,内部包含线程保护,回调函数若有延时,将影响其它线程效率 *PS: 弹窗消息仅回调主要接口,其它消息回调所有接口 ******************************************************/ EXPORT_C int WINAPI send_message(MessageType type, const char *pszFormat, ...); /**************************************************** *Function: 同步回调消息,注册后可接收,一般用于UI注册接收,底层发送 *Intput: type 消息类型 MessageType pszmsg 提示消息内容 *Output: NULL *Return: 成功返回消息返回值(MessageResult),失败返回错误码(<0) *PS: 支持多线程,内部包含线程保护,回调函数若有延时,将影响其它线程效率 *PS: 弹窗消息仅回调主要接口,其它消息回调所有接口 ******************************************************/ EXPORT_C int WINAPI send_messages(MessageType type, const char *pszmsg = 0); /**************************************************** *Function: 异步回调消息,注册后可接收,一般用于UI注册接收,底层发送 *Intput: type 消息类型 MessageType pszFormat 提示消息内容或格式 长度<1024 ... 可变参数 *Output: NULL *Return: 成功返回消息返回值(MessageResult),失败返回错误码(<0) *PS: 支持多线程,内部包含线程保护,回调函数若有延时,将影响其它线程效率 *PS: 弹窗消息仅回调主要接口,其它消息回调所有接口 *PS: 异步模式需要确保线程池已经初始化(init_pool) ******************************************************/ EXPORT_C int WINAPI post_message(MessageType type, const char *pszFormat, ...); /**************************************************** *Function: 同步回调消息,注册后可接收,一般用于UI注册接收,底层发送 *Intput: type 消息类型 MessageType pszmsg 提示消息内容 *Output: NULL *Return: 成功返回消息返回值(MessageResult),失败返回错误码(<0) *PS: 支持多线程,内部包含线程保护,回调函数若有延时,将影响其它线程效率 *PS: 弹窗消息仅回调主要接口,其它消息回调所有接口 *PS: 异步模式需要确保线程池已经初始化(init_pool) ******************************************************/ EXPORT_C int WINAPI post_messages(MessageType type, const char *pszmsg = 0); #endif