注册表读取失败
程序员文章站
2022-06-12 16:46:35
...
注册表读取失败
正常读取注册表在这里不做介绍,只是根据工作中遇到的情况做一个记录:
首先看代码:
读取注册表内容,在读取***时,必须注意你要读取数据的长度,我在这个地方花费了半天时间找问题,报234错误不知道什么原因,后来把长度增大正常了。
“#define REG_VALUE_SIZE 1024”
还有在写注册表时,很奇怪明明写成功了但是在注册表路径下找不到,后来在网上看一个博客说,当你的程序是32位,电脑是64位时需要添加 KEY_WOW64_64KEY,否则会写入wow64to32路径下。
BOOL GetStartupWidthReboot(CString &path, const CString regPath, const CString appKeyName)
{
LONG ret = 0;
HKEY hKey = NULL;
DWORD dwTpye = REG_SZ;
DWORD dwValue = REG_VALUE_SIZE; //这个大小一定要先求出来,否则会出错(234),此处的大小一定要足够大,否则会报234错误,长度不够
char data[REG_VALUE_SIZE]; //一定要分配内存,否则也会出错
memset(data, 0, REG_VALUE_SIZE);
//打开注册表
//ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegPath, 0, KEY_QUERY_VALUE|KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKey);
if (ERROR_SUCCESS != ret)
{
TRACE(TEXT("打开注册表失败!"));
return FALSE;
}
//读注册表 //valuename //返回value类型 //数据缓存区 //缓存区大小
ret = RegQueryValueEx(hKey, appKeyName, NULL, &dwTpye, (BYTE*)data, &dwValue);
if (ERROR_SUCCESS != ret)
{
TRACE(TEXT("\n读取注册表失败!"));
RegCloseKey(hKey);
return FALSE;
}
TRACE(TEXT("\n读取注册表成功!"));
path.Format(_T("%s"), data);
TRACE(path);
RegCloseKey(hKey);
return TRUE;
}
BOOL SetStartupWithReboot(const CString regPath, const CString appKeyName, CString appKeyValue) // 模式1设置开机启动,模式2删除开机启动
{
LONG nResult = -1;
HKEY hRegKey = NULL;
nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hRegKey);
if (nResult == ERROR_SUCCESS)
{
TRACE(_T("打开注册表成功。"));
TCHAR *appPath = Common::Instance()->CString2TCHAR(appKeyValue);
nResult = RegSetValueEx(hRegKey, appKeyName, 0, REG_SZ, (const unsigned char *)appPath, appKeyValue.GetLength());//m_szAppPath是要开机启动的程序的路径
if (nResult == ERROR_SUCCESS)
{
TRACE(_T("设置成功。"));
}
else
{
TRACE(_T("设置失败。"));
}
RegCloseKey(hRegKey);
}
else
{
TRACE(_T("打开注册表失败。"));
return FALSE;
}
return TRUE;
}
BOOL DeleteStartup(const CString regPath, const CString appKeyName)
{
// 获取工程文件完整文件名
TCHAR appPath[MAX_PATH];
DWORD dwRes = ::GetModuleFileName(NULL, appPath, MAX_PATH);
CString szLogMessage;
szLogMessage.Format(_T("取得程序完整路径:%s"), appPath);
TRACE(szLogMessage);
LONG nResult;
HKEY hRegKey = NULL;
nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hRegKey);
if (nResult == ERROR_SUCCESS)
{
TRACE(_T("打开注册表成功。"));
nResult = RegDeleteValue(hRegKey, appKeyName);
if (nResult == ERROR_SUCCESS)
{
TRACE(_T("ok"));
}
else
{
TCHAR szBuffer[1024];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, nResult, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
szBuffer, sizeof(TCHAR), NULL);
szLogMessage.Format(_T("删除注册表项失败:[%s]"), szBuffer);
TRACE(szLogMessage);
}
RegCloseKey(hRegKey);
}
else
{
TRACE(_T("打开注册表失败。"));
return FALSE;
}
return TRUE;
}
上一篇: 健身达人分享:教你如何做腹部健身
下一篇: 中医针灸可美容祛斑