- UID
- 151
- 积分
- 388
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-10
- 最后登录
- 1970-1-1
|
发表于 2002-1-21 10:01:00
|
显示全部楼层
参考代码
1.先获得一个唯一或相对唯一的数据,比如硬盘的物理序列号(这是硬盘厂家设定的,这是唯一的)、C盘的序列号(注意不是卷标,此号在格式化时生成的,相对唯一)。然后你就有一个对于该机器能够锁定的信息,当然这个信息你可以对其加密,基本上64位就够了。前边所讲的取得序列号和加密在网上有很多现成的东东,我这里就不一一写出来了。
2.将系统目录下一个大小适中的Dll文件引入到你的ARX工程中作为资源,在你的程序启动时将此资源生成到系统目录(或其它目录也行),文件名字和该目录下某个动态库名字可以十分相近,如:本来叫User32.Dll,你可以叫UserEx32.Dll等等。要想不引人注意,写成别的文件名当然也行。如果启动时该文件已存在就不用再重新生成了。
3.这时候我们就有两个变量了:LPCTSTR lpszDataText和LPCTSTR lpszFileName
4.下边的代码中我加入了时间限制
- #define FIRSTPOS 2047L
- #define SECONDPOS (FIRSTPOS*4)
- #define THIRDPOS (FIRSTPOS*16)
- #define FOUTHPOS (FIRSTPOS*20)
- #define FIFTHPOS (FIRSTPOS*21)
- //当文件新建立时调用
- BOOL DoNewFile(LPCTSTR lpszDataText,LPCTSTR lpszFileName,int nLimitCount)
- {
- try
- {
- CFile fileWrite;
- if(!fileWrite.Open(lpszFileName,CFile::modeReadWrite))
- throw 0;
- time_t timeTime;
- time(&timeTime);
- srand(timeTime);
- if(fileWrite.Seek(FIRSTPOS-2,CFile::begin)!=FIRSTPOS-2)
- throw 0;
- int nValue=rand();
- fileWrite.Write(&nValue,2);
- fileWrite.Write(&timeTime,sizeof(time_t));
- nValue=rand();
- fileWrite.Write(&nValue,2);
-
- time(&timeTime);
- if(fileWrite.Seek(SECONDPOS-2,CFile::begin)!=SECONDPOS-2)
- throw 0;
- nValue=rand();
- fileWrite.Write(&nValue,2);
- fileWrite.Write(&timeTime,sizeof(time_t));
- nValue=rand();
- fileWrite.Write(&nValue,2);
-
- time(&timeTime);
- if(fileWrite.Seek(THIRDPOS-2,CFile::begin)!=THIRDPOS-2)
- throw 0;
- nValue=rand();
- fileWrite.Write(&nValue,2);
- fileWrite.Write(&timeTime,sizeof(time_t));
- nValue=rand();
- fileWrite.Write(&nValue,2);
-
- if(fileWrite.Seek(FOUTHPOS,CFile::begin)!=FOUTHPOS)
- throw 0;
- CString strAuthor=_T("Author:masterhe");
- fileWrite.Write((LPCTSTR)strAuthor,strAuthor.GetLength());
- nValue=rand();
- fileWrite.Write(&nValue,2);
- time(&timeTime);
- fileWrite.Write(&timeTime,sizeof(time_t));
- nValue=rand();
- fileWrite.Write(&nValue,2);
-
- if(fileWrite.Seek(FIFTHPOS-2,CFile::begin)!=FIFTHPOS-2)
- throw 0;
- nValue=rand();
- fileWrite.Write(&nValue,2);
- DWORD dwLength=_tcslen(lpszDataText);
- fileWrite.Write(&dwLength,sizeof(DWORD));
- fileWrite.Write(lpszDataText,dwLength);
- fileWrite.Write(&nLimitCount,sizeof(nLimitCount));
- nValue=rand();
- fileWrite.Write(&nValue,2);
-
- fileWrite.Close();
- }
- catch(...)
- {
- ::AfxMessageBox(_T("你的提示!"));
- return FALSE;
- }
- return TRUE;
- }
- //检查文件中次数是否可靠
- BOOL CheckUsedCountIsValid(LPCTSTR lpszDataText,LPCTSTR lpszFileName,int nLimitCount)
- {
- try
- {
- CFile fileWrite;
- if(!fileWrite.Open(lpszFileName,CFile::modeReadWrite))
- throw 0;
- time_t timeTime1,timeTime2;
-
- if(fileWrite.Seek(FIRSTPOS,CFile::begin)!=FIRSTPOS)
- throw 0;
- fileWrite.Read(&timeTime1,sizeof(time_t));
- if(fileWrite.Seek(SECONDPOS,CFile::begin)!=SECONDPOS)
- throw 0;
- fileWrite.Read(&timeTime2,sizeof(time_t));
- if(fileWrite.Seek(THIRDPOS,CFile::begin)!=THIRDPOS)
- throw 0;
- fileWrite.Read(&timeTime1,sizeof(time_t));
- CTime time1(timeTime1),time2(timeTime2);
- if(time1>CTime::GetCurrentTime())
- {
- SYSTEMTIME timeDest;
- time1.GetAsSystemTime(timeDest);
- ::SetLocalTime(&timeDest);
- }
- if(time1<time2)
- {
- SYSTEMTIME timeDest;
- time2.GetAsSystemTime(timeDest);
- ::SetLocalTime(&timeDest);
- }
- if(fileWrite.Seek(FIFTHPOS,CFile::begin)!=FIFTHPOS)
- throw 0;
- DWORD dwLength;
- fileWrite.Read(&dwLength,sizeof(DWORD));
- CString strInfo;
- fileWrite.Read(strInfo.GetBuffer(dwLength+1),dwLength);
- strInfo.ReleaseBuffer(dwLength);
- int nLimit;
- fileWrite.Read(&nLimit,sizeof(nLimit));
- int nLimit1=nLimit+1;
- fileWrite.Seek(-sizeof(nLimit),CFile::current);
- fileWrite.Write(&nLimit1,sizeof(nLimit1));
- time_t timeTime;
- time(&timeTime);
- if(fileWrite.Seek(THIRDPOS,CFile::begin)!=THIRDPOS)
- throw 0;
- fileWrite.Write(&timeTime,sizeof(time_t));
- fileWrite.Close();
- if(nLimit>nLimitCount || nLimit<=0)
- {//次数已超
- throw 1;
- }
- if(strInfo!=lpszDataText)
- throw 1;
- int nMonth=3;
- CTime timeEnd;
- if(time2.GetMonth()+nMonth>12)
- timeEnd=CTime(time2.GetYear()+1,time2.GetMonth()+nMonth-12,time2.GetDay(),time2.GetHour(),time2.GetMinute(),time2.GetSecond());
- else
- timeEnd=CTime(time2.GetYear(),time2.GetMonth()+nMonth,time2.GetDay(),time2.GetHour(),time2.GetMinute(),time2.GetSecond());
-
- if(CTime::GetCurrentTime()>=timeEnd)
- {
- //已超时
- return FALSE;
- }
- }
- catch(...)
- {
- DeleteFile(lpszFileName);
- return FALSE;
- }
- return TRUE;
- }
复制代码
就写这么多吧,直接在这上边写程序眼手都累。 |
|