1. 程式人生 > >WINDOWS程式設計--32程式作業系統的登錄檔項的方法

WINDOWS程式設計--32程式作業系統的登錄檔項的方法

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();
}