win7 64下RegOpenKeyEx返回的值不正确(转)

80 篇文章 2 订阅
1 篇文章 0 订阅

环境:win7 64位,vs2010,32位dll应用程序

	HKEY hkey;
	// if exist "HKEY_LOCAL_MACHINE\SOFTWARE\Apple Computer, Inc.\QuickTime",return
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Apple Computer, Inc.\\QuickTime"), 0, samDesiredOpen, &hkey) == ERROR_SUCCESS)
	{
		RegCloseKey(hkey);
		return 0;
	}

	// create key
	if(RegCreateKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Apple Computer, Inc.\\QuickTime"), &hkey) != ERROR_SUCCESS)
		return 0;
本来是想手动新建注册表项,结果注册表明明没东西,却返回ERROR_SUCCESS,百度一下

解决:

使用RegEnableReflectionKey/RegDisableReflectionKey,并且加上KEY_WOW64_64KEY

需要先判断是不是64位操作系统

void SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo)
{
    if (NULL==lpSystemInfo)    return;
    typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
    LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
    if (NULL != fnGetNativeSystemInfo)
    {
        fnGetNativeSystemInfo(lpSystemInfo);
    }
    else
    {
        GetSystemInfo(lpSystemInfo);
    }
}
再操作注册表

REGSAM samDesiredOpen = KEY_ALL_ACCESS;
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
    samDesiredOpen |= KEY_WOW64_64KEY;
}
RegEnableReflectionKey(HKEY_LOCAL_MACHINE);
HKEY hkey;
// if exist "HKEY_LOCAL_MACHINE\SOFTWARE\Apple Computer, Inc.\QuickTime",return
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Apple Computer, Inc.\\QuickTime"), 0, samDesiredOpen, &hkey) == ERROR_SUCCESS)
{
    RegCloseKey(hkey);
    return 0;
}
RegDisableReflectionKey(HKEY_LOCAL_MACHINE);


参考:http://bbs.csdn.net/topics/380026254

http://bbs.pediy.com/showthread.php?t=159321

http://wenku.baidu.com/link?url=NtpRZQ-6SFkgjCSJTdmnEVlRO233YiKx0Ukvh0HZcu3zSDsUQQXCK2g-KoBeld-s-t46VNsrRPh3O0bAqmwkWuv0Pc_Y4Nvm2B_pk-gZZ3K

https://msdn.microsoft.com/en-us/library/ms724897%28v=VS.85%29.aspx

https://msdn.microsoft.com/en-us/library/ms724072%28v=vs.85%29.aspx

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Win7中设置登录背景可以通过修改注册表实现。以下是一个使用C语言编写的程序,可以设置Windows 7的登录背景: ```c #include <windows.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hKey; DWORD dwType, dwSize; TCHAR szValue[MAX_PATH] = {0}; TCHAR szPath[MAX_PATH] = {0}; TCHAR szDefaultPath[MAX_PATH] = _T("C:\\Windows\\System32\\oobe\\info\\backgrounds\\backgroundDefault.jpg"); DWORD dwDisposition = 0; // 打开注册表键 if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { // 设置壁纸路径 _tcscpy_s(szPath, MAX_PATH, _T("C:\\Windows\\System32\\oobe\\info\\backgrounds\\mybackground.jpg")); RegSetValueEx(hKey, _T("OEMBackground"), 0, REG_DWORD, (LPBYTE)szPath, sizeof(DWORD)); RegCloseKey(hKey); } // 设置默认壁纸路径 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { dwSize = MAX_PATH; if (RegQueryValueEx(hKey, _T("OEMBackground"), NULL, &dwType, (LPBYTE)szValue, &dwSize) == ERROR_SUCCESS) { if (_tcslen(szValue) > 0 && _tcsicmp(szValue, szDefaultPath) != 0) { // 如果当前壁纸不是默认壁纸,则备份当前壁纸并设置默认壁纸 _tcsncpy_s(szPath, MAX_PATH, szValue, MAX_PATH - 1); _tcscat_s(szPath, MAX_PATH, _T(".bak")); CopyFile(szValue, szPath, FALSE); RegSetValueEx(hKey, _T("OEMBackground"), 0, REG_DWORD, (LPBYTE)szDefaultPath, sizeof(DWORD)); } } RegCloseKey(hKey); } return 0; } ``` 需要注意的是,这个程序需要管理员权限才能运行成功。如果没有管理员权限,则不能修改注册表键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值