📄 drvapi.cpp
字号:
#include "StdAfx.h"
#include "Drvapi.h"
/****************************
功能:
记录日志
参数:
filaname,日志文件名
fmt,格式字符串
...,格式对应的值
返回值:
-1,打开文件失败
0,成功
*****************************/
int Writelog(char *filename,const char *fmt,...)
{
FILE *fp;
char buff[1000];
va_list ap;
if((fp = fopen(filename,"a+")) == NULL)
{
return -1;
}
memset(buff,0x00,sizeof(buff));
va_start(ap,fmt);
vsprintf(buff,fmt,ap);
va_end(ap);
fprintf(fp,"%s\n",buff);
fclose(fp);
return 0;
}
void WriteDebuglog(char *Inbuff)
{
CTime t;
t = CTime::GetCurrentTime();
char dtstr[64];
memset(dtstr,0,sizeof(dtstr));
_snprintf(dtstr,sizeof(dtstr),"%d%02d",t.GetYear(),t.GetMonth());
char filename[1024];
memset(filename,0,sizeof(filename));
::GetCurrentDirectory(sizeof(filename),filename);
strcat(filename,"\\Qu.ini");
int DebugFlag=::GetPrivateProfileInt("General","DEBUG",0,filename);
if(DebugFlag==1)
{
FILE *fp;
memset(filename,0,sizeof(filename));
::GetCurrentDirectory(sizeof(filename),filename);
sprintf(&filename[strlen(filename)],"\\log\\Debug%s.log",&dtstr[2]);
if((fp = fopen(filename,"a+"))==NULL)
{
return;
}
fprintf(fp,"%d-%02d-%02d %02d:%02d:%02d %s\n",
t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond(),Inbuff);
fclose(fp);
}
return;
}
/****************************
功能:
服务,异常日志记录
参数:
flag:0,服务日志记录;1,异常日志记录
fmt,格式字符串
...,格式对应的值
返回值:
-1,失败
0,成功
SevErrWritelog(0,"%s|%s|%s","ocx","read","sdjl");
*****************************/
int SevErrWritelog(int flag,const char *fmt,...)
{
FILE *fp;
char path[256];
char filepath[256];
char dtstr[64];
char buff[1000];
CTime t;
va_list ap;
memset(path,0x00,sizeof(path));
memset(filepath,0x00,sizeof(filepath));
memset(dtstr,0x00,sizeof(dtstr));
memset(buff,0x00,sizeof(buff));
t = CTime::GetCurrentTime();
_snprintf(dtstr,sizeof(dtstr),"%d%02d",t.GetYear(),t.GetMonth());
switch(flag)
{
case 0:
_snprintf(filepath,sizeof(filepath),"log\\Sev%s.log",&dtstr[2]);
break;
case 1:
_snprintf(filepath,sizeof(filepath),"log\\ErrMsg%s.log",&dtstr[2]);
break;
default:
return -1;
}
SetFilePath(filepath,path);
if((fp = fopen(path,"a+")) == NULL)
{
return -1;
}
va_start(ap,fmt);
vsprintf(buff,fmt,ap);
va_end(ap);
memset(dtstr,0x00,sizeof(dtstr));
fprintf(fp,"%s|%s\n",GetDateTime(dtstr),buff);
fclose(fp);
return 0;
}
/****************************
功能:
返日期、时间函数
参数:
str,存放日期、时间的字符串
返回值:
例如,2002.02.28|13:53:30
*****************************/
char *GetDateTime(char *str)
{
time_t t;
struct tm *mytm;
t = time(NULL);
mytm = localtime(&t);
sprintf(str,"%04d.%02d.%02d|%02d:%02d:%02d",mytm->tm_year+1900,mytm->tm_mon+1,mytm->tm_mday,mytm->tm_hour,mytm->tm_min,mytm->tm_sec);
return str;
}
/****************************
功能:
返回当前目录下某一文件(子
目录下某一文件)的绝对路径
参数:
filename,被包装绝对路径的
文件
返回值:
包装绝对路径后字符串
*****************************/
char *SetFilePath(char *filename,char *filenameurl)
{
char path[256];
memset(path,0x00,sizeof(path));
::GetCurrentDirectory(sizeof(path),path);
// _getcwd(path,sizeof(path));
sprintf(filenameurl,"%s\\%s",path,filename);
return filenameurl;
}
/****************************
功能:
返回相关代码的信息
参数:
lpAppName,信息文件小节名
lpKeyName,信息文件的关键字
outmsg,保存读取的信息
返回值:
返回关键字对应的信息描述
如果找不到返回"无相关信息"
*****************************/
char *GetOutputMsg(char *lpAppName,char *lpKeyName,char *outmsg)
{
char path[256];
memset(path,0x00,sizeof(path));
SetFilePath("OutPutMsg.ini",path);
GetPrivateProfileString(lpAppName,lpKeyName,"无相关信息",outmsg,128,path);
return outmsg;
}
char *GetICOutMsg(char *lpAppName,unsigned char *lpKeyName,char *outmsg)
{
char buff[512];
memset(buff,0,sizeof(buff));
int SW1=lpKeyName[0];
int SW2=lpKeyName[1];
if(SW2<0)
SW2=256+SW2;
char keyname[5];
memset(keyname,0,sizeof(keyname));
sprintf(keyname,"%2.2x%2.2x",SW1,SW2);
char key[5];
memset(key,0,sizeof(key));
char path[256];
memset(path,0x00,sizeof(path));
SetFilePath("OutPutMsg.ini",path);
GetPrivateProfileString(lpAppName,keyname,"000",key,4,path);
if(strcmp(key,"000")==0)
sprintf(buff,"%s无相关信息",keyname);
else
GetOutputMsg("ShebeiMsg",key,buff);
sprintf(outmsg,"%s|%s",key,buff);
return outmsg;
}
/****************************
功能:
从字符串0位开始取到指定字符的字符串
参数:
resource:源字符串
dest:目标字符串
dot:指定字符
返回值:
-1:源字符串为空
-2:resource已到字符结束位置
>0:从当前位置到指定字符位置的长度
*****************************/
int GetStrtodot(char *resource,char *dest,char dot)
{
int pos;
if(resource == NULL)
return -1;
pos = 0;
while(resource[pos] != 0)
{
if(resource[pos] != dot)
{
dest[pos] = resource[pos];
pos++;
}
else
break;
}
if(resource[pos] == 0)
return -2;
dest[pos] = 0;
return pos+1;
}
/****************************
功能:
判断一个字符串有多少个字符dot
参数:
str,字符源
dot,字符
返回值:
dot在str中的个数
*****************************/
int GetNdot(char *str,char dot)
{
int num;
int pos;
num = 0;
pos = 0;
while(str[pos] != 0)
{
if(str[pos] == dot)
num+=1;
pos++;
}
return num;
}
int str2hex(unsigned char *read, unsigned char *write, int len)
{
unsigned char dat;
while (len--) {
if (asc2hex(*read++, &dat))
return -1;
*write = *write << 4 | dat;
if (!(len & 1)) {
++write;
}
}
return 0;
}
int asc2hex(unsigned char dat, unsigned char *newdat)
{
if ((dat >= '0') && (dat <= '9'))
*newdat = dat - '0';
else if ((dat >= 'A') && (dat <= 'F'))
*newdat = dat - 'A' + 10;
else if ((dat >= 'a') && (dat <= 'f'))
*newdat = dat - 'a' + 10;
else
return -1;
return 0;
}
/***********************************************
函数名:
int pub_ChangeDefData(char *src, char *des, char identifier, int index)
功能说明:
从不定长数据字段的字符串(该字符串通过标识符identifier间隔各个数据字段)
中取出第n(n=index)个字段.
参数说明:
char *src:
要进行处理的源字符串
char *des:
存放该字段扩充后的字符串
char identifier:
字符串的间隔符的标识符
int index:
字段序号
返回值:
-1: 指针src或者des为NULL
-2: 字符串src为空
-3: 字段序号<1
-4: 指针p分配内存失败
-5: 字段序号>字段总数目
>=0: 该字段字符串的实际长度
整理人:
张学勇
整理时间:
2003年5月7日
***********************************************/
int pub_ChangeDefData(char *src, char *des, char identifier, int index)
{
int k = 0;
int kk = 0;
int num = 0;
int srclen = 0;
int posend = 0;
int posstart = 0;
char *p;
char format[20];
/* 如果src or des 地址为NULL,则返回-1 */
if ((src == NULL) || (des == NULL))
{
return -1;
}
srclen = strlen(src);
/* 如果src为空,则返回-2 */
if (!srclen)
{
return -2;
}
/* 如果字段序号<1,则返回错误 */
if (index < 1)
{
return -3;
}
/* 为指针p申请内存 */
p = (char *)malloc(srclen+3);
/* 指针p申请内存失败, 返回-4 */
if (p == NULL)
{
return -4;
}
memset(p, 0, srclen+3);
memset(format, 0, sizeof(format));
/* 如果字符串的第一个字符不是标识符,则在字符串前加上一个标识符,长度+1 */
if(src[0] != identifier)
{
p[0] = identifier;
memcpy(p+1, src, srclen);
srclen++;
}
/* 否则,原文拷贝 */
else
{
memcpy(p, src, srclen);
}
/* 如果字符串的最后一个字符不是标识符 */
/* 则在字符串后加上一个标识符,长度+1 */
if(p[srclen-1] != identifier)
{
p[srclen] = identifier;
srclen++;
}
/* 整理后的个格式为:
标识符+字符串1+标识符+字符串2+标识符+字符串2+...+标识符
*/
/* 计算整个字符串中有多少个标识符num */
for(k=0; k<srclen; k++)
{
/* 如果该字符是标识符,num加1 */
if (p[k] == identifier)
{
num++;
}
}
/* 如果要取的字段序号比总字段数还要大,则释放指针p1,p2的空间,返回-6 */
if (index > num - 1 )
{
free(p);
return -5;
}
num = 0;
/* 计算要取的字段的起始偏移量和终止偏移量 */
for(k=0; k<srclen; k++)
{
/* 如果该字符是标识符,num加1 */
if (p[k] == identifier)
{
num++;
/* 如果前面标识符的个数等于要取的字段序号 */
if (num == index )
{
/* 则记录起始偏移量 */
posstart = k;
}
/* 如果前面标识符的个数等于要取的字段序号+1 */
if (num == index + 1 )
{
/* 则记录终止偏移量 */
posend = k;
break;
}
/* 如果前面标识符的个数不等于index或者index+1 */
/* 则起始偏移量+1 */
posstart++;
}
}
/* 拷贝目的字段的字符串到des中 */
memcpy(des, p+posstart, posend - posstart);
des[posend - posstart] = 0;
/* 释放指针p的空间 */
free(p);
/* 返回该字段的实际长度 */
return (posend - posstart);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -