我們對註冊表的操作一般的步驟是,開啟、讀寫、關閉,那就先來看看相關最重要的幾個函數介紹吧,其它更多的函數還得靠大家去MSDN查閱。首先來看看,開啟與關閉函數,在讀寫註冊表前,必須先將目標的子鍵開啟,也就是取得一個操作的控制代碼,而開啟這個函數最常用的就是RegCreateKeyEx,如果沒有這個鍵存在,那麼就會自動的建立這個子鍵項。LONG RegCreateKeyEx( HKEY hKey, //父鍵的控制代碼 LPCTSTR lpSubKey, //子鍵名稱 DWORD Reserved, //一般為0 LPTSTR lpClass, //一般為0 DWORD dwOptions, //建立子鍵時的選項 REGSAM samDesired, //開啟檔案 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指定繼承性 PHKEY phkResult, //用於返回子鍵的控制代碼 LPDWORD lpdwDisposition //開啟還是建立子鍵的資訊);如果函數調用成功,會返回ERROR_SUCCESS也就是說成功會返回0,失敗返回非0值。SamDesired參數有多個取值,最後這個lpdwDisposition參數用於返回資訊,有兩個取值:REG_CREATED_NEW_KEY 指定的鍵不存在,那麼建立。REG_OPENED_EXISTING_KEY 指定的鍵存在,那麼開啟。另外還有相近的函數如下:LONG RegOpenKeyEx( HKEY hKey, // 要開啟主鍵的控制代碼 LPCTSTR lpSubKey, //要開啟子鍵 DWORD ulOptions, //保留 REGSAM samDesired, //安全存取參數 PHKEY phkResult //開啟鍵控制代碼的地址);與開啟函數相比,關閉就比較容易了,它的函數原型如下:LONG RegCloseKey( HKEY hKey);所以只需傳入一個要關閉的控制代碼就行了。然後,我們來看看讀寫的相關函數,讀取的函數原型如下:LONG RegQueryValueEx( HKEY hKey, //子鍵控制代碼 LPCTSTR lpValueName, //索引值名稱 LPDWORD lpReserved, //為0 LPDWORD lpType, //返回索引值的資料類型 LPBYTE lpData, //返回索引值的資料 LPDWORD lpcbData //緩衝區的大小);函數調用成功後,返回ERROR_SUCCESS.例如用regedit 查到KEY_LOCAL_MACHINE中存在GUESTTOOLS 我們可以通過以上API來擷取其值及屬性
int GetGuestToolsFilePath( char * filename, char * path){ LONG lRet; HKEY hKey; DWORD dwBuflen = RGE_PATH_LENGTH; char regpath[RGE_PATH_LENGTH] = {0}; char toolspath[RGE_PATH_LENGTH] = {0}; if ( NULL == path ) { printf("The path in GetGuestToolsFilePath is Error"); return -1; } if(Is64BitSystem()){ if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\GUEST TOOLS",0,KEY_QUERY_VALUE,&hKey)!= ERROR_SUCCESS) { printf("##Open the Reg Get WhiteList Path Error##"); return -1; } }else{ if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\GUEST TOOLS",0,KEY_QUERY_VALUE,&hKey)!= ERROR_SUCCESS) { printf("##Open the Reg Get WhiteList Path Error##"); return -1; } } lRet = RegQueryValueExA(hKey,"InstallPath",NULL,NULL,(LPBYTE)regpath,&dwBuflen); if(lRet != ERROR_SUCCESS) { //LOG_DEBUG("Failed to get the Reg Value!!"); printf("##Failed to get the Reg Value From:%s and error:%lu", toolspath, GetLastError()); return -1; } RegCloseKey(hKey); if ('\0' == regpath[0] || RGE_PATH_LENGTH <= strlen(regpath)) { printf("The regpath is Error!!"); return -1; } strcpy(path,regpath); if ( NULL != filename && (IFLE_PATH_LENGTH - RGE_PATH_LENGTH) > strlen(filename)) { strcat(path,filename); } printf("##Get IP Config File Path Success path:%s ##",path); return 0;}