C++及WinAPI读写注册表
需要使用头文件
"windows.h"
1.regoperator.h
/**
*调用WinAPI读写注册表
**/
#ifndef REGOPERATOR_H
#define REGOPERATOR_H
#include"windows.h"
#include"tchar.h"
class RegOperator
{
public:
RegOperator();
void RegWrite(HKEY keyHandle , LPCWSTR subKey, LPCSTR valueName, DWORD valueType, const char *valueString);
unsigned char *RegRead(HKEY keyHandle, LPCWSTR subKey, LPCSTR valueName, LPDWORD valueType);
};
#endif // REGOPERATOR_H
2.regoperator.cpp
#include "regoperator.h"
#include<QDebug>
RegOperator::RegOperator()
{
}
//写注册表
void RegOperator::RegWrite(HKEY keyHandle ,LPCWSTR subKey,LPCSTR valueName,
DWORD valueType,const char *valueString)
{
HKEY hkey;
//如果键存在则打开,不存在则创建
//仍需要以管理员身份运行
if(RegCreateKeyEx(keyHandle,subKey,0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,NULL,&hkey,NULL)==ERROR_SUCCESS){
//当写入REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ时,用RegSetValueExA,否则用RegSetValueEx
if(RegSetValueExA(hkey,valueName,0,valueType,(const BYTE*)valueString,
strlen(valueString))!=ERROR_SUCCESS){
qDebug()<<"注册表写入失败!";
}
}
RegCloseKey(hkey);
//关闭才能写入
}
//读注册表
unsigned char *RegOperator::RegRead(HKEY keyHandle,LPCWSTR subKey, LPCSTR valueName,LPDWORD valueType)
{
HKEY hkey;
//打开以获取得hkey
if(RegOpenKeyEx(keyHandle,subKey,0,KEY_READ,&hkey)!=ERROR_SUCCESS){
return 0;
}
//先查询键值的长度
unsigned long size=0;
//当查询REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型数据时,需要用RegQueryValueExA,
//否则用RegQueryValueEx(注意两者的参数类型不同)
if(RegQueryValueExA(hkey,valueName,0,valueType,NULL,&size)!=ERROR_SUCCESS){
RegCloseKey(hkey);
return 0;
}
unsigned char *result=new unsigned char[size];
memset(result,0,size);//将数组的每个元素设为'/0'
if(RegQueryValueExA(hkey,valueName,0,valueType, result,&size)!=ERROR_SUCCESS){
RegCloseKey(hkey);
return 0;
}
RegCloseKey(hkey);
return result;
}