TimeLimit.cpp
上传用户:qzzxgm
上传日期:2009-12-14
资源大小:1882k
文件大小:7k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // TimeLimit.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "TimeLimit.h"
  5. #include "TimeLimitDlg.h"
  6. #include "RegKey.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTimeLimitApp
  14. BEGIN_MESSAGE_MAP(CTimeLimitApp, CWinApp)
  15. //{{AFX_MSG_MAP(CTimeLimitApp)
  16. // NOTE - the ClassWizard will add and remove mapping macros here.
  17. //    DO NOT EDIT what you see in these blocks of generated code!
  18. //}}AFX_MSG
  19. ON_COMMAND(ID_HELP, CWinApp::OnHelp)
  20. END_MESSAGE_MAP()
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CTimeLimitApp construction
  23. CTimeLimitApp::CTimeLimitApp()
  24. {
  25. // TODO: add construction code here,
  26. // Place all significant initialization in InitInstance
  27. }
  28. /////////////////////////////////////////////////////////////////////////////
  29. // The one and only CTimeLimitApp object
  30. CTimeLimitApp theApp;
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CTimeLimitApp initialization
  33. BOOL CTimeLimitApp::InitInstance()
  34. {
  35. //先获得当前的系统时间
  36. CTime CurTime = CTime::GetCurrentTime();
  37.     //检查软件是否第一次运行,如果是则设定限制时间
  38. //我们这儿设定软件在当前时间两分分钟后禁用
  39. if (!IsInstalled())
  40. {
  41. CTime t = CurTime + CTimeSpan(0,0,2,0);   
  42. SetLimitTime(t.GetYear(),t.GetMonth(),t.GetDay(),
  43.          t.GetHour(),t.GetMinute(),t.GetSecond());
  44. }
  45. else
  46. {
  47. //如果软件不是第一次运行,
  48. //则读取注册表中的时间值,与当前时间比较,
  49. //如果当前时间值超过了软件使用期限,则退出,否则正常启动
  50. CTime LimitTime;
  51. GetLimitTime(LimitTime);
  52. if (CurTime>LimitTime)
  53. {
  54. AfxMessageBox("试用版已到期,请联系购买一个正版使用",MB_OK);
  55. return FALSE;
  56. }
  57. }
  58.    
  59. AfxEnableControlContainer();
  60. // Standard initialization
  61. // If you are not using these features and wish to reduce the size
  62. //  of your final executable, you should remove from the following
  63. //  the specific initialization routines you do not need.
  64. #ifdef _AFXDLL
  65. Enable3dControls(); // Call this when using MFC in a shared DLL
  66. #else
  67. Enable3dControlsStatic(); // Call this when linking to MFC statically
  68. #endif
  69. CTimeLimitDlg dlg;
  70. m_pMainWnd = &dlg;
  71. int nResponse = dlg.DoModal();
  72. if (nResponse == IDOK)
  73. {
  74. // TODO: Place code here to handle when the dialog is
  75. //  dismissed with OK
  76. }
  77. else if (nResponse == IDCANCEL)
  78. {
  79. // TODO: Place code here to handle when the dialog is
  80. //  dismissed with Cancel
  81. }
  82. // Since the dialog has been closed, return FALSE so that we exit the
  83. //  application, rather than start the application's message pump.
  84. return FALSE;
  85. }
  86. BOOL CTimeLimitApp::IsInstalled()
  87. {
  88. BOOL bInstalled = FALSE;
  89. DWORD dwDisposition;
  90. HKEY m_hKey;
  91. //打开注册表
  92. LONG ret = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\TimeLimit", 0L, NULL,
  93. REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition);
  94.     if (ret != ERROR_SUCCESS)    //打开注册表失败
  95. return FALSE;
  96. //从注册表中读入特征值
  97. DWORD dwVal,dwType,dwLen;
  98. ret = RegQueryValueEx(m_hKey, "Installed", NULL, 
  99. &dwType,(unsigned char*)&dwVal,&dwLen);
  100.     if (ret != ERROR_SUCCESS)      //读取数据失败
  101. return FALSE;                        
  102. //检查读到的特征值是否为1,如果是,则表明软件以前已运行过
  103. bInstalled = (dwVal == 1);
  104. //关闭注册表
  105. RegCloseKey(m_hKey);
  106. return bInstalled;
  107. }
  108. BOOL CTimeLimitApp::GetLimitTime(CTime& t)
  109. {
  110. DWORD dwDisposition;
  111. HKEY m_hKey;
  112. //打开注册表
  113. LONG ret = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\TimeLimit", 0L, NULL,
  114. REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition);
  115.     if (ret != ERROR_SUCCESS)    //打开注册表失败
  116. return FALSE;
  117. //从注册表中读入试用期限数据
  118. DWORD nYear,nMonth,nDay,nHour,nMinute,nSecond;
  119. DWORD dwType;
  120. DWORD dwLen;
  121. ret = RegQueryValueEx (m_hKey, "Year", NULL,    //读取年份
  122. &dwType,(unsigned char*)&nYear,&dwLen);
  123.     if (ret != ERROR_SUCCESS)      //读取数据失败
  124. return FALSE;                        
  125. ret = RegQueryValueEx (m_hKey, "Month", NULL,    //读取月份
  126. &dwType,(unsigned char*)&nMonth,&dwLen);
  127.     if (ret != ERROR_SUCCESS)      //读取数据失败
  128. return FALSE;                        
  129. ret = RegQueryValueEx (m_hKey, "Day", NULL,    //读取天
  130. &dwType,(unsigned char*)&nDay,&dwLen);
  131.     if (ret != ERROR_SUCCESS)      //读取数据失败
  132. return FALSE;                        
  133. ret = RegQueryValueEx (m_hKey, "Hour", NULL,    //读取小时
  134. &dwType,(unsigned char*)&nHour,&dwLen);
  135.     if (ret != ERROR_SUCCESS)      //读取数据失败
  136. return FALSE;                        
  137. ret = RegQueryValueEx (m_hKey, "Minute", NULL,    //读取分钟
  138. &dwType,(unsigned char*)&nMinute,&dwLen);
  139.     if (ret != ERROR_SUCCESS)      //读取数据失败
  140. return FALSE;                        
  141. ret = RegQueryValueEx (m_hKey, "Second", NULL,    //读取秒
  142. &dwType,(unsigned char*)&nSecond,&dwLen);
  143.     if (ret != ERROR_SUCCESS)                         //读取数据失败
  144. return FALSE;                        
  145. //关闭注册表
  146. RegCloseKey(m_hKey);
  147. t = CTime(nYear,nMonth,nDay,nHour,nMinute,nSecond);
  148. return TRUE;
  149. }
  150. BOOL CTimeLimitApp::SetLimitTime(DWORD nYear,DWORD nMonth,DWORD nDay,
  151.               DWORD nHour,DWORD nMinute,DWORD nSecond)
  152. {
  153.     DWORD dwDisposition;
  154. HKEY m_hKey;
  155. //打开注册表
  156. LONG ret = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\TimeLimit", 0L, NULL,
  157. REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition);
  158.     if (ret != ERROR_SUCCESS)    //打开注册表失败
  159. return FALSE;
  160. //向注册表中写入试用期限数据
  161. ret = RegSetValueEx (m_hKey, "Year", NULL,      //写入年
  162. REG_DWORD,(CONST BYTE*)&nYear,sizeof(DWORD));
  163.     if (ret != ERROR_SUCCESS)                       //写入数据失败       
  164. return FALSE;                        
  165. ret = RegSetValueEx (m_hKey, "Month", NULL,     //写入月份
  166. REG_DWORD,(CONST BYTE*)&nMonth,sizeof(DWORD));
  167.     if (ret != ERROR_SUCCESS)                       //写入数据失败
  168. return FALSE;                        
  169. ret = RegSetValueEx (m_hKey, "Day", NULL,       //写入天
  170. REG_DWORD,(CONST BYTE*)&nDay,sizeof(DWORD));
  171.     if (ret != ERROR_SUCCESS)                       //写入数据失败
  172. return FALSE;                        
  173. ret = RegSetValueEx (m_hKey, "Hour", NULL,      //写入小时
  174. REG_DWORD,(CONST BYTE*)&nHour,sizeof(DWORD));
  175.     if (ret != ERROR_SUCCESS)                       //写入数据失败
  176. return FALSE;                        
  177. ret = RegSetValueEx (m_hKey, "Minute", NULL,    //读取年份数据
  178. REG_DWORD,(CONST BYTE*)&nMinute,sizeof(DWORD));
  179.     if (ret != ERROR_SUCCESS)                       //写入数据失败
  180. return FALSE;                        
  181. ret = RegSetValueEx (m_hKey, "Second", NULL,    //写入秒
  182. REG_DWORD,(CONST BYTE*)&nSecond,sizeof(DWORD));
  183.     if (ret != ERROR_SUCCESS)                       //写入数据失败
  184. return FALSE;    
  185. //写入特征数据
  186. DWORD dwVal = 1;
  187. ret = RegSetValueEx (m_hKey, "Installed", NULL,    //写入特征值
  188. REG_DWORD,(CONST BYTE*)&dwVal,sizeof(DWORD));
  189.     if (ret != ERROR_SUCCESS) //写入数据失败
  190. return FALSE;                 
  191. //关闭注册表
  192. RegCloseKey(m_hKey);
  193. return TRUE;  
  194. }