⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvapi.cpp

📁 Vc++管理系统
💻 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 + -