1. 程式人生 > >Windows 獲取登錄檔屬性

Windows 獲取登錄檔屬性

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