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

书籍源码

开发平台:

Visual C++

  1. // RegeditDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Regedit.h"
  5. #include "RegeditDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CRegeditDlg dialog
  50. CRegeditDlg::CRegeditDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CRegeditDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CRegeditDlg)
  54. m_strCompany = _T("");
  55. m_strOwner = _T("");
  56. //}}AFX_DATA_INIT
  57. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  58. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  59. }
  60. void CRegeditDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62. CDialog::DoDataExchange(pDX);
  63. //{{AFX_DATA_MAP(CRegeditDlg)
  64. DDX_Text(pDX, IDC_COMPANY, m_strCompany);
  65. DDX_Text(pDX, IDC_OWNER, m_strOwner);
  66. //}}AFX_DATA_MAP
  67. }
  68. BEGIN_MESSAGE_MAP(CRegeditDlg, CDialog)
  69. //{{AFX_MSG_MAP(CRegeditDlg)
  70. ON_WM_SYSCOMMAND()
  71. ON_WM_PAINT()
  72. ON_WM_QUERYDRAGICON()
  73. ON_BN_CLICKED(IDC_QUERY, OnQuery)
  74. ON_BN_CLICKED(IDC_MODIFY, OnModify)
  75. //}}AFX_MSG_MAP
  76. END_MESSAGE_MAP()
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CRegeditDlg message handlers
  79. BOOL CRegeditDlg::OnInitDialog()
  80. {
  81. CDialog::OnInitDialog();
  82. // Add "About..." menu item to system menu.
  83. // IDM_ABOUTBOX must be in the system command range.
  84. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  85. ASSERT(IDM_ABOUTBOX < 0xF000);
  86. CMenu* pSysMenu = GetSystemMenu(FALSE);
  87. if (pSysMenu != NULL)
  88. {
  89. CString strAboutMenu;
  90. strAboutMenu.LoadString(IDS_ABOUTBOX);
  91. if (!strAboutMenu.IsEmpty())
  92. {
  93. pSysMenu->AppendMenu(MF_SEPARATOR);
  94. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  95. }
  96. }
  97. // Set the icon for this dialog.  The framework does this automatically
  98. //  when the application's main window is not a dialog
  99. SetIcon(m_hIcon, TRUE); // Set big icon
  100. SetIcon(m_hIcon, FALSE); // Set small icon
  101. // TODO: Add extra initialization here
  102. return TRUE;  // return TRUE  unless you set the focus to a control
  103. }
  104. void CRegeditDlg::OnSysCommand(UINT nID, LPARAM lParam)
  105. {
  106. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  107. {
  108. CAboutDlg dlgAbout;
  109. dlgAbout.DoModal();
  110. }
  111. else
  112. {
  113. CDialog::OnSysCommand(nID, lParam);
  114. }
  115. }
  116. // If you add a minimize button to your dialog, you will need the code below
  117. //  to draw the icon.  For MFC applications using the document/view model,
  118. //  this is automatically done for you by the framework.
  119. void CRegeditDlg::OnPaint() 
  120. {
  121. if (IsIconic())
  122. {
  123. CPaintDC dc(this); // device context for painting
  124. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  125. // Center icon in client rectangle
  126. int cxIcon = GetSystemMetrics(SM_CXICON);
  127. int cyIcon = GetSystemMetrics(SM_CYICON);
  128. CRect rect;
  129. GetClientRect(&rect);
  130. int x = (rect.Width() - cxIcon + 1) / 2;
  131. int y = (rect.Height() - cyIcon + 1) / 2;
  132. // Draw the icon
  133. dc.DrawIcon(x, y, m_hIcon);
  134. }
  135. else
  136. {
  137. CDialog::OnPaint();
  138. }
  139. }
  140. // The system calls this to obtain the cursor to display while the user drags
  141. //  the minimized window.
  142. HCURSOR CRegeditDlg::OnQueryDragIcon()
  143. {
  144. return (HCURSOR) m_hIcon;
  145. }
  146. void CRegeditDlg::OnQuery() 
  147. {
  148. HKEY hKEY; //定义有关的 hKEY, 在查询结束时要关闭。
  149. //打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表
  150. //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。
  151. LPCTSTR data_Set="Software\Microsoft\Windows\CurrentVersion\";
  152. //访问注册表,hKEY则保存此函数所打开的键的句柄。
  153. long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_READ, &hKEY));
  154. if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行
  155. {
  156. MessageBox("错误: 无法打开有关的hKEY!");
  157. return;
  158. }
  159. //查询有关的数据 (用户姓名 owner_Get)
  160. LPBYTE owner_Get=new BYTE[80];
  161. DWORD type_1=REG_SZ;
  162. DWORD cbData_1=80;
  163. //hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,"RegisteredOwner"。
  164. //表示要查询的键值名,type_1表示查询数据的类型,owner_Get保存所。
  165. //查询的数据,cbData_1表示预设置的数据长度。
  166. long ret1=::RegQueryValueEx(hKEY,"RegisteredOwner", NULL,&type_1,owner_Get,&cbData_1);
  167. if(ret1!=ERROR_SUCCESS)
  168. {
  169. MessageBox("错误: 无法查询有关注册表信息!");
  170. return;
  171. }
  172. //查询有关的数据 (公司名 company_Get)
  173. LPBYTE company_Get=new BYTE [80];
  174. DWORD type_2=REG_SZ; DWORD cbData_2=80;
  175. long ret2=::RegQueryValueEx(hKEY,"RegisteredOrganization",NULL,&type_2,company_Get,&cbData_2);
  176. if(ret2!=ERROR_SUCCESS)
  177. {
  178. MessageBox("错误: 无法查询有关注册表信息!");
  179. return;
  180. }
  181. //将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。
  182. m_strOwner=CString(owner_Get);
  183. m_strCompany=CString(company_Get);
  184. delete[] owner_Get; delete[] company_Get;
  185. //程序结束前要关闭已经打开的 hKEY。
  186. ::RegCloseKey(hKEY);
  187. UpdateData(FALSE);
  188. }
  189. //转换字符串
  190. LPBYTE CRegeditDlg::CString_To_LPBYTE(CString str)
  191. {
  192. LPBYTE lpb=new BYTE[str.GetLength()+1]; 
  193. for(int i=0;i<str.GetLength(); i++)
  194. lpb[i]=str[i];
  195. lpb[str.GetLength()]=0;
  196. return lpb;
  197. }
  198. void CRegeditDlg::OnModify() 
  199. {
  200. UpdateData(TRUE);
  201. //通过对话框输入新的用户信息,保存到str_owner和str_company
  202. //定义有关的 hKEY, 在程序的最后要关闭.
  203. HKEY hKEY; 
  204. LPCTSTR data_Set="Software\Microsoft\Windows\CurrentVersion";
  205. //打开与路径 data_Set 相关的hKEY,KEY_WRITE表示以写的方式打开.
  206. long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE, &hKEY));
  207. if(ret0!=ERROR_SUCCESS)
  208. {
  209. MessageBox("错误: 无法打开有关的hKEY!");
  210. return;
  211. }
  212. //修改有关数据(用户姓名 owner_Set),要先将CString型转换为LPBYTE。
  213. LPBYTE owner_Set=CString_To_LPBYTE(m_strOwner);
  214. DWORD type_1=REG_SZ;
  215. DWORD cbData_1=m_strOwner.GetLength()+1; 
  216. //与RegQureyValueEx()类似,hKEY表示已打开的键的句柄,"RegisteredOwner"
  217. //表示要访问的键值名,owner_Set表示新的键值,type_1和cbData_1表示新值。
  218. //的数据类型和数据长度
  219. long ret1=::RegSetValueEx(hKEY, "RegisteredOwner", NULL,
  220. type_1,owner_Set,cbData_1);
  221. if(ret1!=ERROR_SUCCESS)
  222. {
  223. MessageBox("错误: 无法修改有关注册表信息!");
  224. return;
  225. }
  226. //修改有关的数据 (公司名 company_Set)
  227. LPBYTE company_Set=CString_To_LPBYTE(m_strCompany);
  228. DWORD type_2=REG_SZ; 
  229. DWORD cbData_2=m_strCompany.GetLength()+1; 
  230. long ret2=::RegSetValueEx(hKEY, "RegisteredOrganization", NULL,
  231. type_2,company_Set, cbData_2);
  232. if(ret2!=ERROR_SUCCESS)
  233. {
  234. MessageBox("错误: 无法修改有关注册表信息!");
  235. return;
  236. }
  237. else
  238. {
  239. MessageBox("修改注册表成功!");
  240. }
  241. }