注册表操作

  今天遇到一个问题,因为同时在写两个工具,在一个工具中我下面的这段代码是可以正常执行并且获取结果的。

    HKEY hKey;
    DWORD result = 0;
    DWORD dwFlag;
    CString strMsg;

    
    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Store"), 0, KEY_EXECUTE, &hKey);
    if (result != ERROR_SUCCESS){
        if (result == ERROR_FILE_NOT_FOUND){
            dwFlag = 0;
        }
    }
    else{
        DWORD lsize;
        TCHAR *value = (TCHAR *)malloc(1024);
        result = RegQueryValueEx(hKey, _T("Test"), NULL, NULL, (LPBYTE)value, &lsize);
        if (result != ERROR_SUCCESS){
            if (result == ERROR_FILE_NOT_FOUND){
                dwFlag = 0;
            }
        }
        else{
            CString strConsumerValue = _T("XXXX");
            CString strCommercialValue = _T("XXXXX");
            if (strConsumerValue.CompareNoCase(value) == 0){
                dwFlag = 1;
            }
            else if (strCommercialValue.CompareNoCase(value) == 0){
                dwFlag = 2;
            }
            else{
                dwFlag = 0;
            }
        }
    }

 

但是我换到另外一个工具上去用,RegQueryValueEx的返回值一直是2.用Error Lookup看一下这个错误码代表说找不到指定的文件或路径。

这就奇怪了,明明在同一台测试机上,为什么两个程序,同样的代码会有不同的结果呢?

然后在编译的过程中我突然发现,第二个程序是32位的,而第一个程序是64位的,这就给我带来了一条新的线索,因为以前开发过程中有碰到过因为32位和64位程序而出现不同行为的情况。

果真,还真是这个原因。

 

因为32位程序在访问注册表的时候,会默认打开32位的注册表,而路径与64位的注册表不同。所以导致怎么都找不到。

在RegOpenKeyEx中加上KEY_WOW64_64KEY之后就能够正常访问了。

正常访问的代码如下:

	HKEY hKey;
	DWORD result = 0;
	DWORD dwFlag;
	CString strMsg;

	result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Store"), 0, KEY_EXECUTE|KEY_WOW64_64KEY, &hKey);
	if (result != ERROR_SUCCESS){
		if (result == ERROR_FILE_NOT_FOUND){
			dwFlag = 0;
		}
	}
	else{
		DWORD lsize;
		TCHAR *value = (TCHAR *)malloc(1024);
		result = RegQueryValueEx(hKey, _T("XXXXXX"), NULL, NULL, (LPBYTE)value, &lsize);
		if (result != ERROR_SUCCESS){
			if (result == ERROR_FILE_NOT_FOUND){
				dwFlag = 0;
			}
		}
		else{
			CString strConsumerValue = _T("XXXXXX");
			CString strCommercialValue = _T("XXXXXX");
			if (strConsumerValue.CompareNoCase(value) == 0){
				dwFlag = 1;
			}
			else if (strCommercialValue.CompareNoCase(value) == 0){
				dwFlag = 2;
			}
			else{
				dwFlag = 0;
			}
		}
	}

  

posted @ 2017-01-05 13:31  专属9号  阅读(174)  评论(0编辑  收藏  举报