You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1336 lines
50 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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 <direct.h>
#include <iomanip>
#include <io.h>
#include <stdarg.h>
#pragma warning(disable: 4996)
#else
#include <sys/dir.h>
#include <sys/type.h>
#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. 当切割符出现在首部时返回NULLstrtok会直到出现有效字符为止进行切割
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