C++ 读取REG_SZ 、REG_DWORD 、REG_MULTI_SZ 类型注册表值
读取REG_SZ 类型的注册表键值

// 读取 REG_SZ 类型键值的代码 HKEY hKey = NULL;
DWORD dwSize = ;
DWORD dwDataType = ;
LPBYTE lpValue = NULL;
LPCTSTR const lpValueName = _T("TcpPort"); LONG lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\MSSQLServer\\MSSQLServer\\SuperSocketNetLib\\Tcp"),
,
KEY_QUERY_VALUE,
&hKey);
if(ERROR_SUCCESS != lRet)
{
// Error handling (see this FAQ)
// return;
}
// Call once RegQueryValueEx to retrieve the necessary buffer size
::RegQueryValueEx(hKey,
lpValueName,
,
&dwDataType,
lpValue, // NULL
&dwSize); // will contain the data size // Alloc the buffer
lpValue = (LPBYTE)malloc(dwSize); // Call twice RegQueryValueEx to get the value
lRet = ::RegQueryValueEx(hKey,
lpValueName,
,
&dwDataType,
lpValue,
&dwSize);
::RegCloseKey(hKey);
if(ERROR_SUCCESS != lRet)
{
// Error handling
// return;
}
// Enjoy of lpValue...
cout << "port ----------------------- " << lpValue << endl; // free the buffer when no more necessary
free(lpValue); // 此段代码来源:http://forums.codeguru.com/showthread.php?247020-Windows-SDK-Registry-How-can-I-read-data-from-the-registry&s=读取REG_DWORD 类型的注册表键值

// 读取 REG_DWORD 类型的注册表键值代码 long lRet;
HKEY hKey;
DWORD port;
DWORD dwType = REG_DWORD;
DWORD dwValue;
lRet = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\MSSQLServer\\Client\\SuperSocketNetLib\\Tcp",
,
KEY_QUERY_VALUE,
&hKey
); //打开注册表
if(lRet == ERROR_SUCCESS)//读操作成功
{
lRet = RegQueryValueEx(
hKey,
"DefaultPort",
,
&dwType,
(LPBYTE)&port,
&dwValue
); //如果打开成功,则读
if(lRet == ERROR_SUCCESS)
{
printf("\n打开成功,则读:");
cout << "DefaultPort: " << port << endl;
//mcfile << "DefaultPort: " << port << endl;
mcfile << "<port>" << port << "</port>" << endl;
}
//以下是读取失败
else
{
printf("\n读取失败:");
} }
//以下是打开失败
else
{
printf("\n打开失败:");
}
RegCloseKey(hKey);//记住,一定要关闭读取REG_MULTI_SZ 类型的注册表键值

#include "windows.h"
#include "tchar.h"
#include "conio.h"
#include "stdio.h" #define MY_KEY _T("PathToMyRegistryKey\\MyRegistryKey") // Registry key
#define MY_VALUES _T("NameOfTheREG_MULTI_SZListOfValues") // Registry values
#define NEW_VALUE _T("MyNewValue") // New value
#define FIND_VALUE _T("AnExistingValue") // We will insert the new value after this one int _tmain(int argc, _TCHAR* argv[])
{
LONG lResult = ;
HKEY hKey = NULL;
LPTSTR lpValues = NULL;
LPTSTR lpValue = NULL;
LPTSTR lpNewValues = NULL;
LPTSTR lpNewValue = NULL;
DWORD cbValues = ;
DWORD cbNewValues = ;
DWORD cbNewValue = ;
BOOL bFound = FALSE; __try
{
// OPEN THE REGISTRY KEY
//
_tprintf(_T("RegOpenKeyEx..."));
lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
MY_KEY,
,
KEY_ALL_ACCESS,
&hKey
);
if (ERROR_SUCCESS != lResult) { _tprintf(_T("ERROR 0x%x\n"), lResult); return ; }
_tprintf(_T("SUCCESS\n")); // READ THE REG_MULTI_SZ VALUES
//
// Get size of the buffer for the values
_tprintf(_T("RegQueryValueEx..."));
lResult = RegQueryValueEx(
hKey,
MY_VALUES,
NULL,
NULL,
NULL,
&cbValues
);
if (ERROR_SUCCESS != lResult) { _tprintf(_T("ERROR 0x%x\n"), lResult); return ; }
_tprintf(_T("SUCCESS\n")); // Allocate the buffer
_tprintf(_T("malloc..."));
lpValues = (LPTSTR)malloc(cbValues);
if (NULL == lpValues) { _tprintf(_T("ERROR 0x%x\n"), GetLastError()); return ; }
_tprintf(_T("SUCCESS\n")); // Get the values
_tprintf(_T("RegQueryValueEx..."));
lResult = RegQueryValueEx(
hKey,
MY_VALUES,
NULL,
NULL,
(LPBYTE)lpValues,
&cbValues
);
if (ERROR_SUCCESS != lResult) { _tprintf(_T("ERROR 0x%x\n"), lResult); return ; }
_tprintf(_T("SUCCESS\n")); // SHOW THE VALUES
//
_tprintf(_T("\n**************************\n"));
_tprintf(_T("OLD VALUES\n"));
_tprintf(_T("**************************\n\n"));
lpValue = lpValues;
for (; '\0' != *lpValue; lpValue += _tcslen(lpValue) + )
{
// Show one value
_tprintf(_T("%s\n"), lpValue);
}
_tprintf(_T("\n**************************\n\n")); // INSERT A NEW VALUE AFTER A SPECIFIC VALUE IN THE LIST OF VALUES
//
// Allocate a new buffer for the old values plus the new one
_tprintf(_T("malloc..."));
cbNewValue = (_tcslen(NEW_VALUE) + ) * sizeof(TCHAR);
cbNewValues = cbValues + cbNewValue;
lpNewValues = (LPTSTR)malloc(cbNewValues);
if (NULL == lpNewValues) { _tprintf(_T("ERROR 0x%x\n"), GetLastError()); return ; }
_tprintf(_T("SUCCESS\n")); // Find the value after which we will insert the new one
lpValue = lpValues;
lpNewValue = lpNewValues;
bFound = FALSE;
for (; '\0' != *lpValue; lpValue += _tcslen(lpValue) + )
{
// Copy the current value to the target buffer
memcpy(lpNewValue, lpValue, (_tcslen(lpValue) + ) * sizeof(TCHAR)); if ( == _tcscmp(lpValue, FIND_VALUE))
{
// The current value is the one we wanted to find
bFound = TRUE; // Copy the new value to the target buffer
lpNewValue += _tcslen(lpValue) + ;
memcpy(lpNewValue, NEW_VALUE, (_tcslen(NEW_VALUE) + ) * sizeof(TCHAR));
lpNewValue += _tcslen(NEW_VALUE) + ;
}
else
{
// This is not the value we want, continue to the next one
lpNewValue += _tcslen(lpValue) + ;
}
}
if (!bFound)
{
// We didn't find the value we wanted. Insert the new value at the end
memcpy(lpNewValue, NEW_VALUE, (_tcslen(NEW_VALUE) + ) * sizeof(TCHAR));
lpNewValue += _tcslen(NEW_VALUE) + ;
}
*lpNewValue = *lpValue; // SHOW THE NEW VALUES
//
_tprintf(_T("\n**************************\n"));
_tprintf(_T("NEW VALUES\n"));
_tprintf(_T("**************************\n\n"));
lpNewValue = lpNewValues;
for (; '\0' != *lpNewValue; lpNewValue += _tcslen(lpNewValue) + )
{
// Show one value
_tprintf(_T("%s\n"), lpNewValue);
}
_tprintf(_T("\n**************************\n\n")); // WRITE THE NEW VALUES BACK TO THE KEY
//
_tprintf(_T("RegSetValueEx..."));
lResult = RegSetValueEx(
hKey,
MY_VALUES,
NULL,
REG_MULTI_SZ,
(LPBYTE)lpNewValues,
cbNewValues
);
if (ERROR_SUCCESS != lResult) { _tprintf(_T("ERROR 0x%x\n"), lResult); return ; }
_tprintf(_T("SUCCESS\n"));
}
__finally
{
// Clean up
//
if (NULL != lpValues) { free(lpValues); }
if (NULL != lpNewValues) { free(lpNewValues); }
if (NULL != hKey) { RegCloseKey(hKey); } //_tprintf(_T("\n<<PRESS ANY KEY>>\n"));
//_getch();
} return ;
} // 此模板来自http://blogs.msdn.com/b/alejacma/archive/2009/11/12/how-to-manipulate-reg-multi-sz-values-from-the-registry-c.aspx
C++ 读取REG_SZ 、REG_DWORD 、REG_MULTI_SZ 类型注册表值的更多相关文章
- c++读取REG_MULTI_SZ类型注册表
First: run RegQueryValueEx to get type and necessary memory size: Single byte code: DWORD type, size ...
- SQL读取注册表值
最近写一个自动检查SQL Serve安全配置的检查脚本,需要查询注册表,下面是使用SQL查询注册表值的方法. ) ) ) ) --For Named instance --SET @Instance ...
- c# 解决读取Excel混合文本类型,数据读取失败的解决方法
错误重现: ----------------------------------------------------------------------- 在导入Excel读取数据时,其中的一个字段保 ...
- Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):1.类型注册]
前言 Autofac Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github. ...
- 利用 Process Monitor 找出某个 Windows 选项所对应的注册表值
多 时候我们要调整一项 Windows 的功能时只需更改一下注册表即可实现.而很多大家眼中所谓的高手,对 Windows 注册表更是玩得出神入化.难道这些高手把 Windows 注册表都记下来了?答案 ...
- 【反射】——Autofac 类型注册
Autofac是.net界一款轻量化的IOC组件,使用Autofac可以帮助完成代码中很多依赖注入工作.在以前文章中,介绍过Autofac的配置过程(http://www.cnblogs.com/Jn ...
- IoC容器Autofac正篇之类型注册(四)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- IoC容器Autofac正篇之类型注册(五)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- java中读取特殊文件的类型
java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...
随机推荐
- OSGi之Bundle
OSGi提出的根源是什么?在我看来就是对JVM的类加载机制进行了扩展,添加了一系列的规则,使得原有的类包(Class Package)扩展到类域(Class Domain).然后是建立在类域上的一系列 ...
- 关于asp.net和iis的进程/线程问题,假如网站有1000个人访问,会产生多少个进程/线程啊
详解 ASP.NET异步 超好的文章
- iis7应用程序池自动关闭问题解决
解决: 应用程序池启动32位应用程序 设置托管管道为集成 (仍然有问题) 图片:123.png 访问网站之前 应用程序池是开启的 访问后 网页报503 service unavailable应用程序池 ...
- 通过store为toolbar添加按钮
目的是实现导航条toolbar可以动态加载按钮. ExtJS的版本是4.0. 实现方案有两个.方案一:添加render事件监听,在监听事件处理函数中使用Ext.Ajax获取按钮信息,实现动态添加按钮. ...
- ios coreData使用
ios中的coredata的使用(转) 分类: ios2013-07-15 18:12 27288人阅读 评论(1) 收藏 举报 Core Data数据持久化是对SQLite的一个升级,它是ios集成 ...
- [转]log4net 使用指南
声明:本文内容主要译自Nauman Leghari的Using log4net,亦加入了个人的一点心得(节3.1.4). 请在这里下载示例代码 1 简介 1.1 ...
- ThinkPHP技巧
在php文件可以用 echo D_S()->getLastSql();来打印出 当前的sql语句
- ubuntu 10.04 fcitx 4.12 实现按下shit切换输入法同时提交英文输入
安装: echo "add fcitx ppa..." sudo apt-add-repository ppa:fcitx-team/nightly sudo apt-get in ...
- mysql使用二进制日志恢复数据
一.恢复到某个二进制文件 1.开启二进制日志 在mysqld的配置节点下添加如下配置 log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,l ...
- “我爱淘”冲刺阶段Scrum站立会议2
完成任务: 已经将菜单栏和首页精选页面整合在一起了,现在正在做第二个界面--分类. 计划任务: 将分类页面制作完毕,并可以整合到整体里,可以进行菜单点击的切换. 遇到问题: 1.分类页面布局的制作不好 ...