c/c++编写window服务的授权服务(三)

 c/c++编写window服务的授权服务(三)

//实现授权服务的函数体LicenseService.cpp

#pragma once #include "LicenseService.h" #include "hex_md5.h" //安装入口点 void main(int argc, char* argv[]) { //初始化全局变量 //获取exe所在目录 CurExeDir=GetCurDir(); //printf("\n当前exe所在目录为:%s\n",CurExeDir); //获取ServerConfig.ini配置参数并初始化全局变量 GetServerConfig_ini(); //开始初始化服务 WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName); //方法一 SERVICE_TABLE_ENTRY ServiceTable[2]; //设置服务名称和服务入口函数 ServiceTable[0].lpServiceName=TServiceName; ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName=NULL; ServiceTable[1].lpServiceProc=NULL; //方法二 /*SERVICE_TABLE_ENTRY ServiceTable[]= { {TEXT(ServiceName),(LPSERVICE_MAIN_FUNCTION)ServiceMain}, { NULL,NULL} };*/ //注册为服务和反注册 //------------------------------------------------- //引数 if(argc<=1) { //usage(使用方法)表示 cout<<"使用方法:"<<endl; //cout<<"zxz\"zxz"<<ENDL; //"install" cout<<"\"install\""; //"or" cout<<"or"; //"uninstall" cout<<"\"uninstall\""; //"exec" cout<<"\"exec \""; cout<<" parameter required in the command line"<<endl; } if(argc>1) { if(_stricmp("install",argv[1])==0) { //install(InstallService) InstallService(); cout<<"installService Succed!"<<endl; } else if(_stricmp("uninstall",argv[1])==0) { //uninstall(UninstallService) UninstallService(); cout<<"UninstallService Succed!"<<endl; } else if(_stricmp("exec",argv[1])==0) { //exec(ServiceMain) RunService(TServiceName); } else { //usage(使用方法)表示 cout<<"使用方法 :"<<endl; //"install" cout<<"\"install\""; //"or" cout<<"or"; //"uninstall" cout<<"\"uninstall\""; //"exec" cout<<"\"exec \""; //"or" cout<<"or"; cout<<" parameter required in the command line"<<endl; } } //------------------------------------------------- //启动服务的控制分派机线程(启动并执行一个新线程) StartServiceCtrlDispatcher(ServiceTable); } //服务入口点(主线程) void ServiceMain(int argc,char** argv) { WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName); int success; //success=InitService(); //if(!success) //{ // //初始化失败,终止服务 // WriteToLog("ServiceMain::InitService初始化失败,终止服务"); // ServiceStatus.dwCurrentState=SERVICE_STOPPED; // ServiceStatus.dwWin32ExitCode=-1; // SetServiceStatus(hStatus,&ServiceStatus); // //退出ServiceMain // return; //} //开始服务 RunService(TServiceName); //注册服务控制处理函数 hStatus = RegisterServiceCtrlHandler(TServiceName,(LPHANDLER_FUNCTION)ControlHandler); if(!hStatus) { WriteToLog("ServiceMain函数中注册服务控制处理函数失败!\n"); return; } //向SCM报告工作状态 RunState=EnumRunState::Running; ServiceStatus.dwCurrentState=SERVICE_RUNNING; ServiceStatus.dwServiceType=SERVICE_WIN32; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN; /*SetServiceStatus(hStatus,&ServiceStatus);*/ 启动工作循环(这个模块在另外一个线程中执行) //while(RunState==EnumRunState::Running) //{ // WriteToLog("ServiceMain函数写日志\n"); // Sleep(500); //} //创建一个终结事件 terminateEvent = CreateEvent (0,TRUE,FALSE,0); if (!terminateEvent) { terminate(GetLastError()); return; } // success = SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR,0,2,1000); if (!success) { terminate(GetLastError()); return; } //初始化 success = InitService(); if (!success) { terminate(GetLastError()); return; } success = SendStatusToSCM(SERVICE_RUNNING,NO_ERROR,0,0,0); if (!success) { terminate(GetLastError()); return; } //等待停止 WaitForSingleObject ( terminateEvent, INFINITE); terminate(0); WriteToLog("ServiceMain函数执行完毕!"); } //服务控制台命令处理函数 void ControlHandler(DWORD request) { DWORD currentState = 0; BOOL success; switch(request) { case SERVICE_CONTROL_STOP: RunState=EnumRunState::Stoped; currentState = SERVICE_STOP_PENDING; ServiceStatus.dwCurrentState=currentState; SetServiceStatus(hStatus,&ServiceStatus); StopService(); return; case SERVICE_CONTROL_PAUSE: RunState=EnumRunState::Pause; currentState = SERVICE_PAUSED; ServiceStatus.dwCurrentState=currentState; SetServiceStatus(hStatus,&ServiceStatus); PauseService(); break; case SERVICE_CONTROL_CONTINUE: RunState=EnumRunState::Running; currentState = SERVICE_RUNNING; ServiceStatus.dwCurrentState=currentState; SetServiceStatus(hStatus,&ServiceStatus); ResumeService(); break; case SERVICE_CONTROL_INTERROGATE: // it will fall to bottom and send status break; // Do nothing in a shutdown. Could do cleanup // here but it must be very quick. case SERVICE_CONTROL_SHUTDOWN: // Do nothing on shutdown return; default: break; } //ServiceStatus.dwCurrentState=currentState; //SetServiceStatus(hStatus,&ServiceStatus); } //初始化服务(开始服务时执行) int InitService() { //重新获取ServerConfig.ini配置参数 GetServerConfig_ini(); int result; WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName); //写日志信息 result=WriteToLog("Monitoring started."); //start listening... //开始一个线程 Start the service's thread DWORD id; threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)ServiceThread,0, 0, &id); if (threadHandle==0) { result=0; } else { result=1; } WriteToLog("InitService一个线程开始了!"); return result; } DWORD WINAPI ServiceThread(LPDWORD param) { //线程操作 WriteToLog("线程操作ServiceThread开始!"); StartHostPortListen(host,atoi(port)); WriteToLog("线程操作ServiceThread完成!"); return 0; } //实现 开始主机+端口监听函数 void StartHostPortListen(char* ipaddr,int port) { //port=9998; WORD wVersionRequested; WSADATA wsaData; int err; //版本请求 wVersionRequested = MAKEWORD(2, 2); //初始化WinSock(WSAStartup函数) err = WSAStartup( wVersionRequested, &wsaData); if ( err != 0 ) { //初始化出错了退出函数 return; } //初始化成功!但版本不一致! 退出函数 if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); //清除Socket return; //退出函数 } //生成一个socket(sockSrv变量) //SOCK_STREAM 用于TCP协议 //SOCK_DGRAM 用于UDP协议 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //使用TCP协议 //设置一个地址Socket(addrSrv变量) SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(ipaddr); //本机IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(port); //端口9998 //绑定函数(指定本地IP地址所使用的端口号时候使用) //(把sockSrv变量与addrSrv变量绑定在一起) bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //监听端口开始 if(listen(sockSrv,MAX_PENDING_CONNECTS)!=0) { printf("监听socket失败:%d\n ",::WSAGetLastError()); return;//ExitProcess(STATUS_FAILED); } printf("开始监听..."); //接收来自客户端的请求连接 SOCKET sockClient; SOCKADDR_IN addrClient;//定义一个客户端Socket地址 int len=sizeof(SOCKADDR); char recvBuf[100]; int recv_len=-1; // sockaddr_in acc_sin; int acc_sin_len; acc_sin_len=sizeof(acc_sin); // while(true) { //接收Socket请求 来自客户端的Connect sockClient=accept(sockSrv,(struct sockaddr*)&acc_sin, &acc_sin_len); if(sockClient>=0) { //创建一个线程来处理socket请求threadHandle DWORD id; HANDLE threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)HandleSocket,(LPVOID)sockClient, 0, &id); // } else { //没有客户端接入 printf("没有客户端接入2\n"); } Sleep(200); } //关闭Socket变量sockSrv closesocket(sockSrv); //清除Socket WSACleanup(); } //实现 处理Socket请求函数 DWORD WINAPI HandleSocket(LPVOID lpParam) { SOCKET sockClient=(SOCKET)lpParam; //接收数据并保存到recvBuf变量中 char recvBuf[100]; int recv_len=-1; bool Exits=false; while(Exits==false) { recv_len=recv(sockClient,recvBuf,100,0); //recv_len=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); if(recv_len>0) { //输出数据 recvBuf[recv_len]='\0'; //在末尾加入字符串结束符号 '\0 ' printf("%s\n",recvBuf); printf("本次数据接收结束。\n "); //处理(传入请求类型) char* ret; ret=new char[recv_len]; strcpy(ret,recvBuf); bool rlcmd=false,stop=false; rlcmd=EqStr(ret,"RequestLicenseCommand"); stop=EqStr(ret,"stop"); if(rlcmd==true) { //请求类型为:RequestLicenseCommand bool LicenseAbled=false; //计算License是否可用 LicenseAbled=false;//true; //需进一步判断 LicenseAbled=IsLencense(); //----- char* retmsg="stop"; if(LicenseAbled==true )//&& recvBuf==reqCmd { //可用 retmsg="start"; } else { //不可用 retmsg="stop"; } WriteToLog(retmsg); if(send(sockClient,retmsg,strlen(retmsg),0)==SOCKET_ERROR) { printf("回发信息报错了: %d\n ",WSAGetLastError()); } printf("本次数据处理结束。\n "); } if(stop==true) { //请求类型为:stop Exits=true; //退出(结束本线程) } } } printf("退出(结束本线程)\n "); return 0; } //运行服务函数 BOOL RunService(WCHAR* sSvcName) { SC_HANDLE schSCManager; SC_HANDLE scHandle; BOOL boolRet; // open to SCM schSCManager = OpenSCManager( 0, 0, SC_MANAGER_ALL_ACCESS ); //Open scHandle = OpenService( schSCManager, sSvcName, SERVICE_ALL_ACCESS ); //start boolRet = StartService( scHandle, 0, NULL); return boolRet; } VOID ResumeService() { //pauseService=FALSE; //ResumeThread(threadHandle); return; } VOID PauseService() { //pauseService = TRUE; //SuspendThread(threadHandle); return; } VOID StopService() { RunState=EnumRunState::Stoped;//=FALSE; // Set the event that is holding ServiceMain // so that ServiceMain can return SetEvent(terminateEvent); } //安装函数 void InstallService() { SC_HANDLE schService; SC_HANDLE schSCManager; TCHAR szPath[512]; WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName); //Install Starting... //获取模块文件路径名称 if(!GetModuleFileName(NULL,szPath,512)) { return; } // open to SCM  schSCManager = OpenSCManager( 0, // pointer to machine name string 0, // pointer to database name string SC_MANAGER_CREATE_SERVICE // type of access ); if (!schSCManager) { //WriteToLog("OpenScManagerErrorID:"+GetLastError()); return; } // Install 新服务 schService = CreateService( schSCManager, // handle to service control manager database TServiceName, // pointer to name of service to start TServiceName, // pointer to display name SERVICE_ALL_ACCESS,// type of access to service SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,// type of service SERVICE_DEMAND_START,// when to start service SERVICE_ERROR_NORMAL,// severity if service fails to start szPath, // pointer to name of binary file NULL, // pointer to name of load ordering group NULL, // pointer to variable to get tag identifier NULL, // pointer to array of dependency names NULL, // pointer to account name of service NULL // pointer to password for service account ); if (!schService) { WriteToLog("服务安装出错了"); //WriteToLog("CreateServiceErrorID:"+GetLastError()); return; } else { WriteToLog("服务已安装Service installed\n"); } // clean up CloseServiceHandle(schService); CloseServiceHandle(schSCManager); WriteToLog("安装服务已结束Install Ended...\n"); } //反安装函数 void UninstallService() { SC_HANDLE schService; SC_HANDLE schSCManager; BOOL success; SERVICE_STATUS svcStatus; WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName); WriteToLog("反安装开始Uninstall Starting..."); // open to SCM  schSCManager = OpenSCManager( 0,// pointer to machine name string 0,// pointer to database name string SC_MANAGER_CREATE_SERVICE // type of access ); if (!schSCManager) { //WriteToLog("OpenScManagerErrorID:"+GetLastError()); return; } //打开一个服务 schService = OpenService( schSCManager, // handle to service control manager database TServiceName, // pointer to name of service to start SERVICE_ALL_ACCESS | DELETE// type of access to service ); if (!schService) { WriteToLog("OpenServiceErrorID:"+GetLastError()); return; } //(if necessary) success = QueryServiceStatus(schService, &svcStatus); if (!success) { WriteToLog("In QueryServiceStatus ErrorID:"+GetLastError()); return; } if (svcStatus.dwCurrentState != SERVICE_STOPPED) { WriteToLog("Stopping service..."); success = ControlService( schService, // handle to service SERVICE_CONTROL_STOP, // control code &svcStatus // pointer to service status structure ); if (!success) { WriteToLog("In ControlServiceErrorID:"+GetLastError()); return; } } //等待 do { QueryServiceStatus(schService,&svcStatus); Sleep(500); }while(SERVICE_STOP_PENDING==svcStatus.dwCurrentState); if(SERVICE_STOPPED!=svcStatus.dwCurrentState) { WriteToLog("Failed to Stop Service ErrorID:"+GetLastError()); return; } //删除服务 success = DeleteService(schService); if (success) { WriteToLog("Service removed\n"); } else { WriteToLog("In DeleteService ErrorID:"+GetLastError()); return; } //Clean up CloseServiceHandle(schService); CloseServiceHandle(schSCManager); WriteToLog("反安装结束Uninstal Ended..."); } //实现 发送状态到SCM服务控制管理器 BOOL SendStatusToSCM (DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint) { BOOL success; SERVICE_STATUS serviceStatus; // Fill in all of the SERVICE_STATUS fields serviceStatus.dwServiceType =SERVICE_WIN32_OWN_PROCESS; serviceStatus.dwCurrentState = dwCurrentState; // If in the process of something, then accept // no control events, else accept anything if (dwCurrentState == SERVICE_START_PENDING) serviceStatus.dwControlsAccepted = 0; else serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN; // if a specific exit code is defines, set up // the win32 exit code properly if (dwServiceSpecificExitCode == 0) serviceStatus.dwWin32ExitCode =dwWin32ExitCode; else serviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; serviceStatus.dwServiceSpecificExitCode =dwServiceSpecificExitCode; serviceStatus.dwCheckPoint = dwCheckPoint; serviceStatus.dwWaitHint = dwWaitHint; // Pass the status record to the SCM //SERVICE_STATUS_HANDLE serviceStatusHandle; success = SetServiceStatus (hStatus,&serviceStatus); if (!success) { StopService(); } return success; } //实现 服务终结函数 VOID terminate(DWORD error) { // if terminateEvent has been created, close it. if (terminateEvent) { CloseHandle(terminateEvent); } // Send a message to the scm to tell about // stop age if (hStatus) { SendStatusToSCM(SERVICE_STOPPED, error,0, 0, 0); } // If the thread has started kill it off if (threadHandle) { CloseHandle(threadHandle); } // Do not need to close serviceStatusHandle } //---------------------------------------------------- //通用函数的实现 //实现 字符串格式转换 char*转为WCHAR* WCHAR* CharPtr2ACharPtr(const char* src) { // Convert to a wchar_t* size_t srcsize = strlen(src) + 1; size_t newsize = srcsize; size_t convertedChars = 0; wchar_t *wcstring; wcstring=new wchar_t[newsize]; mbstowcs_s(&convertedChars, wcstring, srcsize, src, _TRUNCATE); //wcscat_s(wcstring, L" (wchar_t *)"); //wcout << wcstring << endl; return wcstring; } //实现 写日志 int WriteToLog(char* str) { FILE* log; char* curdir; if(CurExeDir==NULL) { CurExeDir=GetCurDir(); } curdir=CurExeDir; char* Logfile=UnionStr(curdir,LogFileName); log=fopen(Logfile,"a+"); if(log==NULL) return 0; fprintf(log,"%s\n",str); fclose(log); return 1; } //实现 获取当前可执行文件所在目录 char* GetCurDir(void) { //推荐用如下方法来得到当前程序所在目录比较安全: //void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); //函数来分解开始提到的_pgmptr,然后再用 //void _makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext ); //函数来对分解后的路径进行组合。这两个函数结合起来功能强大,使用灵活, //基本上所有的有关目录和路径方面的操作都可以搞定. //(1) char* szFilePath=new char[MAX_PATH]; memset(szFilePath,0,MAX_PATH); GetModuleFileNameA(NULL,szFilePath,MAX_PATH); //GetModuleFileNameW(NULL,szFilePath,MAX_PATH); char* szfp=new char[strlen(szFilePath)+1]; strcpy(szfp,szFilePath); int srcLen=strlen(szfp)+1; char* Driver=new char[srcLen]; char* dir=new char[srcLen]; char* fn=new char[srcLen]; char* ext=new char[srcLen]; // memset(Driver,0,srcLen); memset(dir,0,srcLen); memset(fn,0,srcLen); memset(ext,0,srcLen); //分解路径 _splitpath(szfp,Driver,dir,fn,ext); char* dri=new char[strlen(Driver)+1]; strcpy(dri,Driver); char* dir_t=new char[strlen(dir)+1]; strcpy(dir_t,dir); //组合目录 int len=strlen(dri)+strlen(dir_t); char* result=new char[len]; memset(result,0,len); sprintf(result, "%s\\%s",dri,dir_t); char* r=new char[strlen(result)+1]; strcpy(r,result); return r; } //实现 替换字符串中特征字符串为指定字符串 int ReplaceStr(char *sSrc, char *sMatchStr, char *sReplaceStr) { int StringLen; int MAX_MSG_LENGTH=strlen(sSrc)+1; char* caNewString=new char[MAX_MSG_LENGTH]; char *FindPos = strstr(sSrc, sMatchStr); if( (!FindPos) || (!sMatchStr) ) return -1; while( FindPos ) { memset(caNewString, 0, sizeof(caNewString)); StringLen = FindPos - sSrc; strncpy(caNewString, sSrc, StringLen); strcat(caNewString, sReplaceStr); strcat(caNewString, FindPos + strlen(sMatchStr)); strcpy(sSrc, caNewString); FindPos = strstr(sSrc, sMatchStr); } return 0; } //实现 合并字符串函数 char* UnionStr(const char* A,const char* B) { int len=strlen(A)+strlen(B); char* result=new char[len]; memset(result,0,len); sprintf(result, "%s%s",A,B); char* r=new char[strlen(result)+1]; strcpy(r,result); return r; } //实现 字符串是否相等函数 bool EqStr(const char* A,const char* B) { bool r=true; char* t_A=new char[strlen(A)+1]; strcpy(t_A,A); char* t_B=new char[strlen(B)+1]; strcpy(t_B,B); int ALen=strlen(t_A); int BLen=strlen(t_B); if(ALen>=BLen) ALen=BLen; { for(int i=0;i<ALen;i++) { if(t_A[i]!=t_B[i]) { r=false; break; } } } return r; } //实现 是数字check函数 bool IsNumber(string str) { bool r=true; const char* t=str.c_str(); int Len=strlen(t); for(int i=0;i<Len;i++) { if(!isdigit(t[i])) { r=false; break; } } return r; } //实现 获取当前系统的年-月-日格式的时间 char* WinApi_Year_Month_Day() { SYSTEMTIME sys; GetLocalTime(&sys); char* s=new char[10]; sprintf(s,"%4d-%02d-%02d",sys.wYear,sys.wMonth,sys.wDay); return s; } //实现 比较日期字符串函数 unsigned long Compare_To_Date(char* datetime1,char* datetime2) { //return 3表示日期格式不正确 //return 2表示datetime1>datetime2 //return 1表示datetime1=datetime2 //return 0表示datetime1<datetime2 unsigned short year1; unsigned short month1; unsigned short day1; unsigned short year2; unsigned short month2; unsigned short day2; unsigned long bValidate; bValidate=Validate_Date(datetime1,&year1,&month1,&day1); if(bValidate==false){ return 3; } bValidate=Validate_Date(datetime2,&year2,&month2,&day2); if(bValidate==false){ return 3; } if(year1<year2) return 0; if(year1>year2) return 2; if(month1<month2) return 0; if(month1>month2) return 2; if(day1<day2) return 0; if(day1>day2) return 2; return 1; } //实现 比较当前日期字符串函数 unsigned long Compare_To_Current_Date(char* datetime){ unsigned short year; unsigned short month; unsigned short day; unsigned long bValidate=Validate_Date(datetime,&year,&month,&day); if(bValidate==false){ return 3; } SYSTEMTIME CurTime; GetLocalTime(&CurTime); if(CurTime.wYear>year) return 2; else if(CurTime.wYear<year) return 0; if(CurTime.wMonth>month) return 2; else if(CurTime.wMonth<month) return 0; if(CurTime.wDay>day) return 2; else if(CurTime.wDay<day) return 0; return 1; } //实现 验证日期字符串格式正确性函数 unsigned long Validate_Date(char* date,unsigned short * year,unsigned short * month,unsigned short * day){ if(strlen(date)<10) return false; std:string s(date); string _1=s.substr(4,1); string _2=s.substr(7,1); if(!EqStr(_1.c_str(),"-")) return false; if(!EqStr(_2.c_str(),"-")) return false; string szyear=s.substr(0,4);//yyyy-mm-dd string szmonth=s.substr(5,2); string szday=s.substr(8,2); if(IsNumber(szyear)==false) return false; if(IsNumber(szmonth)==false) return false; if(IsNumber(szday)==false) return false; unsigned long bResult; try { *year=(unsigned short)atol(szyear.c_str()); *month=(unsigned short)atol(szmonth.c_str()); *day=(unsigned short)atol(szday.c_str()); bResult= true; } catch(...) { bResult=false; } return bResult; } //实现 获取机器码函数 char* GetMachineCode(void) { char* cpuid=GetCpuId(); char* ret; for(int i=0;i<=2;i++) { ret=md5(cpuid); cpuid=ret; } return ret; } //实现 获取Cpu编号函数 char* GetCpuId(void) { unsigned long s1,s2; __asm { mov eax,01h xor edx,edx cpuid mov s1,edx mov s2,eax } //CString CPUID; //CPUID.Format("%08X%08X",s1,s2); //return CPUID; char ret[255]; sprintf(ret,"%08X%08X",s1,s2); char* lpmac=ret; char* RetVal=new char[strlen(lpmac)+1]; strcpy(RetVal,lpmac); return RetVal; } //实现 md5加密算法函数 char* md5(char* src) { char md5[64] = {0}; hex_md5(src, md5, 32); char* ret; ret=new char[strlen(md5)+1]; strcpy(ret,md5); return ret; } //实现 是否有使用权的函数 bool IsLencense(void) { bool r=true; char* cpuid=GetCpuId(); char* curdate=WinApi_Year_Month_Day(); //char* todate="2011-12-31"; char* tmpmachinecode=UnionStr(cpuid,todate); char* regcode=md5(tmpmachinecode); //printf("%s\n",regcode);printf("%s\n",code); //WriteToLog(regcode);WriteToLog(code); if(EqStr(regcode,code)==true) { printf("注册码有效(%s=%s)\n",code,regcode); //时间是否过期 //curdate<=todate //printf("curdate=%s\n",curdate);printf("todate=%s\n",todate); int retval=Compare_To_Date(curdate,todate); //printf("retval=%d\n",retval); if(retval==0 || retval==1) { r=true; } else { r=false; } } else { r=false; printf("注册码无效(%s=%s)\n",code,regcode); } return r; } //实现 获取ServerConfig.ini参数函数 bool GetServerConfig_ini(void) { char* curdir; if(CurExeDir==NULL) { CurExeDir=GetCurDir(); } curdir=CurExeDir; //获取ini文件中的数据 char* inifn="ServerConfig.ini"; int len=strlen(curdir)+strlen(inifn)+1; char* inipath=new char[len]; sprintf(inipath, "%s\\%s", curdir, inifn); //printf(inipath); //--------- char* line; filepath =inipath; if(OpenFile()==true) { char* line; while(!EndFile()) { line=NextLine(); if(line!=NULL) { //printf("%s\n",line); int lineLen=strlen(line); if(lineLen>0) { if(line[0]!=';') { if(strstr(line,"LicenseServerHost=")!=NULL) { host=line; } if(strstr(line,"Port=")!=NULL) { port=line; } if(strstr(line,"ToDate=")!=NULL) { todate=line; } if(strstr(line,"LicenseCode=")!=NULL) { code=line; } } } } } CloseFile(); } ReplaceStr(host,"LicenseServerHost=",""); ReplaceStr(port,"Port=",""); ReplaceStr(todate,"ToDate=",""); ReplaceStr(code,"LicenseCode=",""); printf("host->%s\n",host); printf("port->%s\n",port); printf("todate->%s\n",todate); printf("code->%s\n",code); return true; } //实现 打开文件操作 bool OpenFile(void) { char* path=filepath; if((fp=fopen(path,"r"))==NULL) { printf("file cannot be opened\n"); return false; } return true; } //实现 检查文件是否结束函数 int EndFile(void) { return feof(fp); } //实现 读取下一行函数 char* NextLine() { char line[4000]; if(fgets(line,4000,fp)!=NULL) { char* ret=new char[strlen(line)+1]; strcpy(ret,line); return ret; } return NULL; } //实现 关闭文件函数 int CloseFile(void) { if(fp!=NULL) { return fclose(fp); } return -1; } //---the---end---

转载于:https://www.cnblogs.com/sqlite3/archive/2011/12/03/2566773.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你的程序加密过OD MD5值支持二次开发使用 防破解验证也可实现一机一码 VC++ 开发 STARTUPINFO startup; PROCESS_INFORMATION process; CString g_strCompanyName1 = ""; CString g_strCompanyName2 = ""; CString g_strCompanyName3 = ""; CString g_strCompanyName = "**"; BOOL CTaiShanApp::InitInstance() { AfxEnableControlContainer(); //#ifdef ZJH m_gMessageID = ::RegisterWindowMessage("WsSendMessageHqData"); CFileFind fnd; if(S_OK != ::CoInitialize (NULL)) return FALSE; // ReadDiskIDPartCwd(); // if(!FyRegister::IsValidUser()) // return FALSE; memset( &startup, 0, sizeof( startup ) ); startup.cb = sizeof( startup ); memset( &process, 0, sizeof( process ) ); if(fnd.FindFile ("WsSendMessageShare.exe")) { m_gbUseExe = true; } hAppMutex=::CreateMutex(NULL,TRUE,m_pszExeName); if(GetLastError() == ERROR_ALREADY_EXISTS) { CWnd *pPrevWnd = CWnd::GetDesktopWindow()->GetWindow(GW_CHILD); while(pPrevWnd) { if(::GetProp(pPrevWnd->GetSafeHwnd(),m_pszExeName)) { if(pPrevWnd->IsIconic()) pPrevWnd->ShowWindow(SW_RESTORE); pPrevWnd->SetForegroundWindow(); pPrevWnd->GetLastActivePopup()->SetForegroundWindow(); return false; } pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT); } return false; } //#endif #ifndef _NET_AUTHEN HMODULE hModule; hModule = LoadLibrary("ide21201.dll"); if (hModule==NULL) { AfxMessageBox("Can't find ide21201.dll"); return FALSE; } char *(WINAPI * GetIdeSerial)(); GetIdeSerial = (char *(WINAPI *)())GetProcAddress(hModule, "GetIdeSerial"); if (GetIdeSerial==NULL) { AfxMessageBox("Can't find GetIdeSerial in ide21201.dll"); return FALSE; } CString strSerialNumber;// = SERIAL_NUMBER; strSerialNumber = GetIdeSerial(); strSerialNumber.TrimLeft(" "); if (strSerialNumber.Compare(SERIAL_NUMBER)!=0) { AfxMessageBox("序列号错误"); return FALSE; } #else CDlgLogin dlgLogin; int nResponse = dlgLogin.DoModal(); if (nResponse!=1) return FALSE; #endif /* CDialogShowInformation dlg; dlg.DoModal();*/ int nResult; m_bAppAuthorized=TRUE; // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. CTaiTestSplash *m_splash; BOOL SplashOpen=FALSE; m_splash = new CTaiTestSplash; SplashOpen=m_splash->Create(); if( SplashOpen ) m_splash->ShowWindow(SW_SHOW); DWORD Currenttime=GetTickCount(); BeginWaitCursor(); #ifdef TEST_USER1 t = CTime::GetCurrentTime(); CTime t2 = g_timeUseEnd; if(t >= t2) { // AfxMessageBox("试用期已过,若想继续使用,请购买正式版!",MB_OK | MB_ICONSTOP); return false; } else 以上为部分代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值