注册表操作
今天遇到一个问题,因为同时在写两个工具,在一个工具中我下面的这段代码是可以正常执行并且获取结果的。
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; } } }