读书人

请教一下注册表中的xzYear,xzMonth,

发布时间: 2012-05-09 12:13:59 作者: rapoo

请问一下,注册表中的xzYear,xzMonth,xzDay三个值等于多少时,程序运行才不会提示过期?
bool CCenterServerManage::getIntTime(CTime * pTime)
{
if (!AfxSocketInit())
{
AfxMessageBox("联网失败");
return FALSE;
}

CString strServer("");
CSocket sockClient;
sockClient.Create();//创建socket
strServer="time.ien.it";

sockClient.Connect((LPCTSTR)strServer, 37); // strServer:时间服务器网址; 37:端口号

DWORD dwTime = 0;//用来存放服务器传来的标准时间数据
unsigned char nTime[8];//临时接收数据
memset(nTime, 0, sizeof(nTime));

sockClient.Receive(nTime, sizeof(nTime));//接收服务器发送来得4个字节的数据
sockClient.Close();//关闭socket

dwTime += nTime[0] << 24;//整合数据
dwTime += nTime[1] << 16;
dwTime += nTime[2] << 8;
dwTime += nTime[3];

if(0 == dwTime)return FALSE;
COleDateTime t00( 1900, 1, 1, 0, 0, 0 ); // 1900.1.1 00:00:00
COleDateTime t70( 1970, 1, 1, 0, 0, 0 ); // 1970.1.1 00:00:00

COleDateTimeSpan ts70to00 = t70 - t00;
DWORD dwSpan = (DWORD)ts70to00.GetTotalSeconds();
ASSERT( dwSpan == 2208988800L );

//把时间变为基于1970年的,便于用CTime处理
dwTime -= dwSpan;
//考虑网络延迟因素
//dwTime += dwDely;
//构造当前时间的CTime对象
CTime timeNow = (CTime)dwTime;
*pTime = timeNow;
return true;
}
bool CCenterServerManage::isTimeOver()
{
int buff[5];//读取值的存储区
CString s_yearBuff;//存储年
CString s_monthBuff;//存储月
CString s_dayBuff;//存储日
int Read=0;
LPBYTE readYear=new BYTE[5];
LPBYTE readMonth=new BYTE[5];
LPBYTE readDay=new BYTE[10];
DWORD w_Lenth=5;
//time_t ct;
//time( &ct) ;/// 当前日期
CTime t2(1990, 1, 1, 0, 0, 0);
getIntTime(&t2);
int a=t2.GetYear();
int b=t2.GetMonth();
int c=t2.GetDay();
buff[0]=a;
buff[1]=b;
buff[2]=c;
s_yearBuff.Format("%d",buff[0]);
s_monthBuff.Format("%d",buff[1]);
s_dayBuff.Format("%d",buff[2]);
DWORD s=REG_SZ/*REG_BINARY*/;
HKEY sub;
CString skey="SOFTWARE\\xz";
LONG return0=RegOpenKeyEx(HKEY_LOCAL_MACHINE,skey,0,KEY_ALL_ACCESS,&sub);
LONG return1=::RegQueryValueEx(sub,"xzYear",NULL,&s,/*(LPBYTE)*/readYear,(LPDWORD)&w_Lenth/*(LPDWORD)sBuff.GetLength()*/);
::RegQueryValueEx(sub,"xzMonth",NULL,&s,readMonth,(LPDWORD)&w_Lenth);
::RegQueryValueEx(sub,"xzDay",NULL,&s,readDay,(LPDWORD)&w_Lenth);

if(return0!=ERROR_SUCCESS)//如果注册表中没有字段值,写入
{
LONG l_Error=0;
LONG l_Temp;
l_Temp=::RegCreateKey(HKEY_LOCAL_MACHINE,skey,&sub);
l_Error+=l_Temp;
l_Temp=RegSetValueEx(sub,"xzYear",NULL,REG_SZ,(BYTE*)s_yearBuff.GetBuffer(0),s_yearBuff.GetLength());
l_Error+=l_Temp;
l_Temp=RegSetValueEx(sub,"xzMonth",NULL,REG_SZ,(BYTE*)s_monthBuff.GetBuffer(0),s_monthBuff.GetLength());
l_Error+=l_Temp;
l_Temp=RegSetValueEx(sub,"xzDay",NULL,REG_SZ,(BYTE*)s_dayBuff.GetBuffer(0),s_dayBuff.GetLength());
l_Error+=l_Temp;
if(l_Error!=0)
{
AfxMessageBox("软件注册错误,软件不可运行!");
delete[] readYear;
delete[] readMonth;
delete[] readDay;
::RegCloseKey(sub);
return false;
}
return true;

}
else //如果注册表中有值,读取
{
int n_Year;
int n_Month;
int n_Day;
//::RegQueryValueEx(sub,"xzMonth",NULL,&s,readMonth/*(BYTE *)sBuff.GetBuffer(0)*/,(LPDWORD)&w_Lenth/*(LPDWORD)sBuff.GetLength()*/);
CString s_Year;
CString s_Month;
CString s_Day;
CString ss;
// 转换成int
s_Year.Format("%s",readYear);
n_Year=atoi(s_Year);//cstring转为int
s_Month.Format("%s",readMonth);
n_Month=atoi(s_Month);//cstring转为int


s_Day.Format("%s",readDay);
n_Day=atoi(s_Day);//cstring转为int
int a;//记录天数
a=(buff[1]-n_Month)*30+(buff[2]-n_Day);
if(a>=26)
{
AfxMessageBox(" 软件已经到期!");
delete[] readYear;
delete[] readMonth;
delete[] readDay;
::RegCloseKey(sub);
return false;
}


}
delete[] readYear;
delete[] readMonth;
delete[] readDay;
::RegCloseKey(sub);
return true;
}

[解决办法]
这么算时间差不准确啊,有大月小月,不能都做30天算吧,你都从服务器取到了时间,只要用COleDateTime运算本地注册表取到的时间和远程服务器时间的差值就可以了,当然看你的算法你只想让软件最多使用26天,本地注册表需要有什么值才不过期左减法就能算出来了

读书人网 >C++

热点推荐