vc++注册表操作
来源:互联网 发布:windows脚本有哪些 编辑:程序博客网 时间:2024/06/05 09:23
1.新建项 例如:在HKEY_LOCAL_MACHINE/SOFTWARE/下新建一个项YanTai,再在YanTai下新建一个项BandSoft HKEY hSoftKey; HKEY hPlaceKey; HKEY hCompanyKey; //打开HKEY_LOCAL_MACHINE/SOFTWARE if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("software"), 0, KEY_WRITE|KEY_READ, &hSoftKey) == ERROR_SUCCESS) { DWORD dw; //创建并打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai if (RegCreateKeyEx(hSoftKey, _T("YanTai"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &hPlaceKey, &dw) == ERROR_SUCCESS) { //创建并打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft if(RegCreateKeyEx(hPlaceKey,_T("BandSoft"),0,REG_NONE, REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_READ,NULL, &hCompanyKey,&dw) == ERROR_SUCCESS) { RegCloseKey(hSoftKey); RegCloseKey(hPlaceKey); RegCloseKey(hCompanyKey); } } } --------------------------------------------------------------------------- 2.在项下新建字符串值 例如在项BandSoft下新建字符串值 名称:ProductName 类型REG_SZ,数据:FD900 System 紧接上面的代码: HKEY hCompanyKey; //打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("software//YanTai//BandSoft"), 0, KEY_WRITE|KEY_READ,&hCompanyKey)==ERROR_SUCCESS) { CString str = "FD900 System"; //加1为字符串最后的空字符/0留空间 LPBYTE lpData = new BYTE[str.GetLength()+1]; for(int i = 0; i < str.GetLength(); i++) { *(lpData+i) = str.GetAt(i); } DWORD cbData = str.GetLength()+1; //新建值 if(RegSetValueEx(hCompanyKey,_T("ProductName"),0,REG_SZ,lpData,cbData) != ERROR_SUCCESS) MessageBox("error"); delete [] lpData; } else MessageBox("error"); RegCloseKey(hCompanyKey); ------------------------------------------------------------------ 3.在项下新建REG_DWORD类型的值 例如在项BandSoft下新建DWORD类型的值 名称:Number ,类型REG_DWORD ,数据:2 HKEY hPlaceKey; HKEY hCompanyKey; DWORD dw; if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//YanTai"),0,KEY_WRITE,&hPlaceKey)) MessageBox("error"); //打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft,如果BandSoft项没有,则创建 if(ERROR_SUCCESS != RegCreateKeyEx(hPlaceKey,"BandSoft",0,REG_NONE,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hCompanyKey,&dw)) MessageBox("error"); //在项BandSoft下新建DWORD类型的值 名称:Number 类型REG_DWORD ,数据:2 DWORD dwValue = 2; char szName[] = "Number"; if(ERROR_SUCCESS != RegSetValueEx(hCompanyKey,szName,0,REG_DWORD,(LPBYTE)&dwValue,sizeof(dwValue))) MessageBox("error"); RegCloseKey(hPlaceKey); RegCloseKey(hCompanyKey); 可以从注册表中看到BandSoft项下名称为:Number ,类型REG_DWORD ,数据:0x00000002(2) ----------------------------------------------------------------------------------------- 5.查询项下的字符串值 例如查询 项BandSoft下 字符串ProductName的值. HKEY hCompanyKey; //打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("software//YanTai//BandSoft"), 0, KEY_WRITE|KEY_READ,&hCompanyKey)==ERROR_SUCCESS) { LPBYTE lpData = new BYTE[80]; DWORD cbData = 80; DWORD dwType = REG_SZ; if(RegQueryValueEx(hCompanyKey,"ProductName",0,&dwType,lpData,&cbData) == ERROR_SUCCESS) { //将lpData 转换成CString 类型 CString strValue; strValue = CString(lpData); //strValue就是你想要查询的值 MessageBox(strValue);//输出FD900 System } else MessageBox("error"); delete [] lpData; } else MessageBox("error"); RegCloseKey(hCompanyKey); ------------------------------------------------------------------------------------- 6.枚举项下所有的键值 例如:枚举启动项下HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run下所有键值, 并用list box控件显示出来: CListBox m_list; HKEY hAutoRunKey; DWORD dwIndex = 0; long lResult; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//Microsoft//Windows//CurrentVersion//Run"), 0,KEY_READ,&hAutoRunKey) == ERROR_SUCCESS) { char szName[100]; DWORD cbName = 100; char szValue[100]; DWORD cbValue = 100; CString strTemp; lResult = RegEnumValue(hAutoRunKey,dwIndex,szName,&cbName,0,NULL,(LPBYTE)szValue,&cbValue); while(lResult == ERROR_SUCCESS && lResult != ERROR_NO_MORE_ITEMS) { strTemp.Format("Name: %s Value : %s",szName,szValue); m_list.AddString(strTemp); dwIndex = dwIndex + 1; //注意一定要给cbName,cbValue重新赋值,因为其值已变,自已这个错误找了一天才找到 cbName = 100; cbValue = 100; lResult = RegEnumValue(hAutoRunKey,dwIndex,szName,&cbName,0,NULL,(LPBYTE)szValue,&cbValue); } } else { MessageBox("error"); } RegCloseKey(hAutoRunKey); --------------------------------------------------------------------------------- 7.枚举项下所有的子项 例如枚举HKEY_LOCAL_MACHINE/SOFTWARE项下所有的子项,并用list box控件显示出来 CListBox m_list HKEY hKey; DWORD dwIndex = 0; long lResult; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"), 0,KEY_READ,&hKey) == ERROR_SUCCESS) { char szKeyName[100]; DWORD cbName = 100; lResult = RegEnumKeyEx(hKey,dwIndex,szKeyName,&cbName,0,NULL,NULL,NULL); while(lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA) { m_list.AddString(szKeyName); dwIndex = dwIndex + 1; //注意一定要给cbName重新赋值,因为其值已变,否则导致下一个RegEumKeyEx错误 cbName = 100; lResult = RegEnumKeyEx(hKey,dwIndex,szKeyName,&cbName,0,NULL,NULL,NULL); } } else { MessageBox("error"); } RegCloseKey(hKey); ------------------------------------------------------------------------------- 8.删除项下的键值 例如删除启动项HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run下 的键名为jfproc HKEY hAutoRunKey; //打开HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//Microsoft//Windows//CurrentVersion//Run"), 0,KEY_WRITE,&hAutoRunKey)) { char szValue[]="jfproc"; if(RegDeleteValue(hAutoRunKey,szValue) != ERROR_SUCCESS) MessageBox("error"); } else MessageBox("error"); RegCloseKey(hAutoRunKey); ----------------------------------------------------------------- 9.删除项(只适用于此项下无子项的情况) 例如删除HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/下的项BandSoft HKEY hKey; //打开HKEY_LOCAL_MACHINE/SOFTWARE/YanTai if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE//YanTai"), 0,KEY_WRITE,&hKey)) { char szKey[]="BandSoft"; if(RegDeleteKey(hKey,szKey) != ERROR_SUCCESS) MessageBox("error"); } else MessageBox("error"); RegCloseKey(hKey); ------------------------------------------------------------------------ 10.删除项(此项下有子项的情况也适用) 编程思想: 先删除此项下所有的子项,再删除此项,由下向上删. 利用RegDeleteKey删除项(项中有子项)时返回值不为ERROR_SUCCESS, 对于项中无键值的项是否应该用SHDeleteEmptyKey,我觉得没必要,用RegDeleteKey即可, 因为注册表每个项中必带一个缺省的名称为空,数据类型:REG_SZ,值也为空字符串的键值. 自定义的删除项的函数 BOOL DeleteKey(HKEY hKey, char *szSubKey) { if(ERROR_SUCCESS == RegDeleteKey(hKey,szSubKey)) return true; //打开项 HKEY hSubKey; //不仅要KEY_WRITE权限,而且枚举子项时要用到KEY_READ权限,自已为这个错找了半天. if(RegOpenKeyEx(hKey,szSubKey,0,KEY_WRITE|KEY_READ,&hSubKey) != ERROR_SUCCESS) return false; //删除项下的子项 DWORD dwIndex = 0; long lResult; char szName[100]; DWORD cbName = 100; lResult = RegEnumKeyEx(hSubKey,dwIndex,szName,&cbName,0,NULL,NULL,NULL); while(lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA) { //recursively delete key DeleteKey(hSubKey,szName); //注意一定要给cbName重新赋值,因为其值已变,否则导致下一个RegEumKeyEx错误 cbName = 100; //千万不要犯加上dwIndex = dwIndex + 1;这样的错误, //因为第一个子顶删除后,第二个子项又变为了第一个子项,永远保持dwIndex=0, //自已就犯这个错误,调试了半天才找到答案 lResult = RegEnumKeyEx(hSubKey,dwIndex,szName,&cbName,0,NULL,NULL,NULL); } RegCloseKey(hSubKey); //项下的子项删除后,现在可以删除项了 RegDeleteKey(hKey,szSubKey); return true; } 使用例子:对于HKEY_LOCAL_MACHINE/SOFTWARE/YanTai/BandSoft中的YanTai项来说, YanTai项下有子项BandSoft,所以删除YanTai项要用到上面的自定义的DeleteKey函数,代码如下: HKEY hKey; //打开HKEY_LOCAL_MACHINE/SOFTWARE if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"), 0,KEY_WRITE,&hKey)) { if(!DeleteKey(hKey,"YanTai")) MessageBox("error"); } else MessageBox("error"); RegCloseKey(hKey);
- VC操作注册表
- VC操作注册表
- VC 注册表操作(转载)
- VC 注册表操作
- vc++注册表操作
- [VC++]注册表简单操作
- VC注册表简单操作
- VC读写注册表操作
- VC操作注册表
- VC++6.0注册表操作
- VC操作注册表
- VC操作注册表
- VC 注册表操作
- vc++注册表操作
- vc简单操作注册表
- VC操作注册表函数
- VC操作注册表函数
- VC操作注册表
- VTP
- Linux与Windows平台的一些兼容性注意事项
- WinAPI: ShellExecute - 打开外部程序或文件
- CSS简洁的左侧二级菜单
- Javascript中最常用的55个经典技巧
- vc++注册表操作
- 移植DNS服务bind到MPC8377E开发板
- http://webwait.com/
- SQL SERVER中collate的含义
- 高质量C++/C编程指南
- TypeError: Error #1034: 强制转换类型失败:无法将 mx.utils::ObjectProxy@32b2c11 转换为 mx.collections.ArrayCollection。
- FAVICON.ICO
- 被感动的十句话
- 我的WCF之旅(1):创建一个简单的WCF程序