高手帮帮忙:重启计算机后,写入注册表的标记消失了???

Alfred2000 2004-11-19 11:06:53
本人编了一个应用软件,想限定用户的使用期限,我的方法是利用注册表,可是我发现当我重启计算机后
我写入注册表的标记竟然不见了,如果重新运行程序,那个标记又写入了注册表.这是怎么回事呀?这根本限制不了用户的使用
请高手指点指点,谢谢!

附(部分代码):
1 头文件:
BOOL IsInstalled();
BOOL GetLimitTime(CTime& t); //t用来存储从注册表中读到的时间值
BOOL SetLimitTime(DWORD nYear,DWORD nMonth,DWORD nDay,
DWORD nHour,DWORD nMinute,DWORD nSecond);
2 *.cpp文件:
BOOL CTimeLimitApp::InitInstance()
{
//先获得当前的系统时间
CTime CurTime = CTime::GetCurrentTime();
//检查软件是否第一次运行,如果是则设定限制时间
//我们这儿设定软件在当前时间两分分钟后禁用
if (!IsInstalled())
{
CTime t = CurTime + CTimeSpan(0,0,2,0);
SetLimitTime(t.GetYear(),t.GetMonth(),t.GetDay(),
t.GetHour(),t.GetMinute(),t.GetSecond());
}
else
{
//如果软件不是第一次运行,
//则读取注册表中的时间值,与当前时间比较,
//如果当前时间值超过了软件使用期限,则退出,否则正常启动
CTime LimitTime;
GetLimitTime(LimitTime);
if (CurTime>LimitTime)
{
AfxMessageBox("试用版已到期,请联系购买一个正版使用",MB_OK);
return FALSE;
}
}
}
//---------------------------------------------------------------------------

BOOL CTimeLimitApp::IsInstalled()
{
BOOL bInstalled = FALSE;

DWORD dwDisposition;
HKEY m_hKey;
//打开注册表
LONG ret = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\\TimeLimit", 0L, NULL,
REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition);
if (ret != ERROR_SUCCESS) //打开注册表失败
return FALSE;

//从注册表中读入特征值
DWORD dwVal,dwType,dwLen;
ret = RegQueryValueEx(m_hKey, "Installed", NULL,
&dwType,(unsigned char*)&dwVal,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;

//检查读到的特征值是否为1,如果是,则表明软件以前已运行过
bInstalled = (dwVal == 1);

//关闭注册表
RegCloseKey(m_hKey);

return bInstalled;
}
//------------------------------------------------------------------
BOOL CTimeLimitApp::GetLimitTime(CTime& t)
{
DWORD dwDisposition;
HKEY m_hKey;
//打开注册表
LONG ret = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\\TimeLimit", 0L, NULL,
REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition);
if (ret != ERROR_SUCCESS) //打开注册表失败
return FALSE;

//从注册表中读入试用期限数据
DWORD nYear,nMonth,nDay,nHour,nMinute,nSecond;
DWORD dwType;
DWORD dwLen;
ret = RegQueryValueEx (m_hKey, "Year", NULL, //读取年份
&dwType,(unsigned char*)&nYear,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;
ret = RegQueryValueEx (m_hKey, "Month", NULL, //读取月份
&dwType,(unsigned char*)&nMonth,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;
ret = RegQueryValueEx (m_hKey, "Day", NULL, //读取天
&dwType,(unsigned char*)&nDay,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;
ret = RegQueryValueEx (m_hKey, "Hour", NULL, //读取小时
&dwType,(unsigned char*)&nHour,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;
ret = RegQueryValueEx (m_hKey, "Minute", NULL, //读取分钟
&dwType,(unsigned char*)&nMinute,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;
ret = RegQueryValueEx (m_hKey, "Second", NULL, //读取秒
&dwType,(unsigned char*)&nSecond,&dwLen);
if (ret != ERROR_SUCCESS) //读取数据失败
return FALSE;

//关闭注册表
RegCloseKey(m_hKey);

t = CTime(nYear,nMonth,nDay,nHour,nMinute,nSecond);

return TRUE;

}
//-------------------------------------------------------------------------------------
BOOL CTimeLimitApp::SetLimitTime(DWORD nYear,DWORD nMonth,DWORD nDay,
DWORD nHour,DWORD nMinute,DWORD nSecond)
{
DWORD dwDisposition;
HKEY m_hKey;
//打开注册表
LONG ret = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\\TimeLimit", 0L, NULL,
REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition);
if (ret != ERROR_SUCCESS) //打开注册表失败
return FALSE;

//向注册表中写入试用期限数据
ret = RegSetValueEx (m_hKey, "Year", NULL, //写入年
REG_DWORD,(CONST BYTE*)&nYear,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;
ret = RegSetValueEx (m_hKey, "Month", NULL, //写入月份
REG_DWORD,(CONST BYTE*)&nMonth,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;
ret = RegSetValueEx (m_hKey, "Day", NULL, //写入天
REG_DWORD,(CONST BYTE*)&nDay,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;
ret = RegSetValueEx (m_hKey, "Hour", NULL, //写入小时
REG_DWORD,(CONST BYTE*)&nHour,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;
ret = RegSetValueEx (m_hKey, "Minute", NULL, //读取年份数据
REG_DWORD,(CONST BYTE*)&nMinute,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;
ret = RegSetValueEx (m_hKey, "Second", NULL, //写入秒
REG_DWORD,(CONST BYTE*)&nSecond,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;

//写入特征数据
DWORD dwVal = 1;
ret = RegSetValueEx (m_hKey, "Installed", NULL, //写入特征值
REG_DWORD,(CONST BYTE*)&dwVal,sizeof(DWORD));
if (ret != ERROR_SUCCESS) //写入数据失败
return FALSE;
//关闭注册表
RegCloseKey(m_hKey);

return TRUE;
}
...全文
197 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
barsteng 2004-11-19
  • 打赏
  • 举报
回复
REG_OPTION_NON_VOLATILE This key is not volatile; this is the default. The information is stored in a file and is preserved when the system is restarted. The RegSaveKey function saves keys that are not volatile.
把你的REG_OPTION_VOLATILE参数修改成REG_OPTION_NON_VOLATILE就行了
wwwhb2000 2004-11-19
  • 打赏
  • 举报
回复
我们原来公司的密码是读取扇区实现的,哈哈,你可以试一试
老夏Max 2004-11-19
  • 打赏
  • 举报
回复
可能是你关闭程序的时候没有关闭注册表,也许你的机器上安装了一些保护的软件!如杀毒程序等等
如果可以的话,发到:xia_qingqi@broadxent.com.cn
我帮你看看!注明帖子的URL!

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧