Windows 獲取登錄檔屬性
阿新 • • 發佈:2018-12-29
我們對登錄檔的操作一般的步驟是,開啟、讀寫、關閉,那就先來看看相關最重要的幾個函式介紹吧,其它更多的函式還得靠大家去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;
}