这几天开始学习winCE,需要修改注册表来实现设备的禁用,因此研究了一下注册表的查询和修改!
网上有这样的程序可以参考,但不是很完整,所以在编程的过程中也出现了一些错误:
如在设置键值时,返回错误值5,出错原因是“没有修改权限”,即在打开注册表时没有正确指定操作权
限KEY_READ|KEY_WRITE。
由于参考了别人的代码,所以本文并非全部原创!
下面是MFC程序的源代码:
void CRegTableDlg::OnInquire() { HKEY hKEY; //定义有关的 hKEY, 在查询结束时要关闭。 LPCTSTR data_Set="Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon\\"; //打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表。 //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 //访问注册表,hKEY则保存此函数所打开的键的句柄。 long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_READ, &hKEY)); if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行 { MessageBox("错误: 无法打开有关的hKEY!"); return; } //查询有关的数据 (用户姓名 owner_Get)。 LPBYTE info=new BYTE[80]; DWORD type_1=REG_SZ ; DWORD cbData_1=80; //hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,"RegisteredOwner"。 //表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 //查询的数据,cbData_1表示预设置的数据长度。 long ret1=::RegQueryValueEx(hKEY, "LegalNoticeCaption", NULL, &type_1, info, &cbData_1); if(ret1!=ERROR_SUCCESS) { MessageBox("错误1: 无法查询有关注册表信息!"); return; } UpdateData(TRUE); m_text = CString(info); UpdateData(FALSE); delete[] info; // 程序结束前要关闭已经打开的 hKEY。 ::RegCloseKey(hKEY); } LPBYTE CString_To_LPBYTE(CString str) { LPBYTE lpb=new BYTE[str.GetLength()]; char *pStr=str.GetBuffer(str.GetLength()); for(int i=0;i<str.GetLength();i++) memcpy(lpb+i,pStr+i,1); str.ReleaseBuffer(); return lpb; } void CRegTableDlg::OnSet() { // TODO: Add your control notification handler code here //修改有关数据(用户姓名 owner_Set),要先将CString型转换为LPBYTE。 HKEY hKEY; //定义有关的 hKEY, 在查询结束时要关闭。 LPCTSTR data_Set="Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon\\"; //打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表。 //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 //访问注册表,hKEY则保存此函数所打开的键的句柄。 long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_READ|KEY_WRITE, &hKEY)); if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行 { MessageBox("错误: 无法打开有关的hKEY!"); return; } UpdateData(TRUE); LPBYTE owner_Set = CString_To_LPBYTE(m_text); UpdateData(FALSE); DWORD type_1=REG_SZ; DWORD cbData_1=m_text.GetLength()+1; //与RegQureyValueEx()类似,hKEY表示已打开的键的句柄,"RegisteredOwner" //表示要访问的键值名,owner_Set表示新的键值,type_1和cbData_1表示新值。 //的数据类型和数据长度 long ret1=::RegSetValueEx(hKEY,"LegalNoticeCaption", 0, type_1, owner_Set,cbData_1); if(ret1!=ERROR_SUCCESS) { MessageBox("错误: 无法修改有关注册表信息!"); return; } }
我现在注册表中增加了一项,以上为MFC程序的两个按钮对应的函数!另外,其中的m_text变量对应一个编辑框!