WINDOWS程式設計--32程式作業系統的登錄檔項的方法
阿新 • • 發佈:2019-01-05
BOOL IsWow64() { typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL bIsWow64 = FALSE; fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { return FALSE; } } return bIsWow64; } // 查詢登錄檔項值 BOOL GetRegQueryValue(HKEY hKey, LPCTSTR lpSubKey,LPCTSTR lpValueName, LPWSTR szQueryValue) { HKEY hKeyResult; // LONG nResult = RegOpenKey(hKey, lpSubKey, &hResult); REGSAM samDesired; if(IsWow64()) samDesired = KEY_READ|KEY_WOW64_64KEY; LONG nResult = RegOpenKeyEx(hKey, lpSubKey, 0, samDesired, &hKeyResult); if(ERROR_SUCCESS != nResult) { return FALSE; } DWORD lValueSize = MAX_PATH, dwType = REG_SZ; nResult = RegQueryValueEx(hKeyResult, lpValueName, NULL, &dwType, (LPBYTE)szQueryValue, &lValueSize); if(ERROR_SUCCESS != nResult) { RegCloseKey(hKeyResult); return FALSE; } RegCloseKey(hKeyResult); return TRUE; } // 設定登錄檔項值 BOOL SetRegQueryValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPWSTR szSetValue) { HKEY hKeyResult; // LONG nResult = RegOpenKey(hKey, lpSubKey, &hKeyResult); REGSAM samDesired; if(IsWow64()) samDesired = KEY_WRITE|KEY_WOW64_64KEY; LONG nResult = RegOpenKeyEx(hKey, lpSubKey, 0, samDesired, &hKeyResult); if(ERROR_SUCCESS != nResult) { return FALSE; } DWORD lValueSize = (lstrlen(szSetValue)+1)*sizeof(TCHAR); DWORD dwType = REG_SZ; nResult = RegSetValueEx(hKeyResult, lpValueName, NULL, dwType, (LPBYTE)szSetValue, lValueSize); if(ERROR_SUCCESS != nResult) { RegCloseKey(hKeyResult); return FALSE; } RegCloseKey(hKeyResult); RegFlushKey(hKey); return TRUE; }
使用例子--注意預設項 字串為空就可以獲取到 #define KEY_PATH _T("CLSID\\{00020420-0000-0000-C000-000000000046}\\InprocServer32") #define KEY_PATH2 _T("CLSID\\{00020424-0000-0000-C000-000000000046}\\InprocServer32") void CRegCompareDlg::OnBnClickedButton1() { TCHAR szQueryValue[1024] = {0}; if (!GetRegQueryValue(HKEY_CLASSES_ROOT, KEY_PATH, _T(""), szQueryValue)) { TRACE(_T("查詢鍵值出錯")); return; } CString str = _T("C:\\Windows\\system32\\oleaut32.dll"); if (str==szQueryValue) { TRACE(_T("查詢鍵值一致,不做處理返回")); return; } if(SetRegQueryValue(HKEY_CLASSES_ROOT, KEY_PATH, _T(""), str.GetBuffer())) { TRACE(_T("設定鍵值成功")); } else { TRACE(_T("設定鍵值失敗")); } str.ReleaseBuffer(); }