2012-11-12 17 views
2

我的代碼工作中wherin我必須得到特別regitry path..For使用fnctions開關鍵及子項 RegOpenKeyEx (HKEY_LOCAL_MACHINE, sk, NULL, KEY_READ, &hKey); 該即時通訊下的數據,上進行調試給我未使用值處理到我需要訪問的路徑。 這裏怎麼回事?有人可以告訴我嗎?註冊表處理用於氯化聚丙烯

void GetAlgorithmList() 
{ 
    HKEY hKey=0; 

    LPCTSTR sk = TEXT("SOFTWARE\\ALGORITHM"); 


    LONG openRes=RegOpenKeyEx (HKEY_LOCAL_MACHINE,sk,NULL,KEY_READ ,&hKey); 

    long lret; 
    PVALENT val_list=0; 

    unsigned long totalsize = 1000; 
    lret = 0; 

    LPWSTR szValueBuf=NULL; 

    lret = RegQueryMultipleValues(hKey,val_list,totalsize,szValueBuf,&totalsize); 
    if (lret == ERROR_SUCCESS) 
    { 
     printf("Success 1"); 
    } 
    FILE* pFile = fopen("D:\\HinalH\\logFile.txt", "a+"); 
    fopen("D:\\logFile.txt", "a+"); 
    fprintf(pFile, "%d\n",szValueBuf); 
    fclose(pFile); 

    RegCloseKey(hKey); 

} 

在此先感謝

+1

'RegOpenKeyEx'可能會失敗。你應該測試它。如果失敗,您可以獲得關於錯誤的擴展信息。看看文檔。 **如果函數失敗,則返回值是Winerror.h中定義的非零錯誤代碼。您可以使用FormatMessage函數與FORMAT_MESSAGE_FROM_SYSTEM標誌來獲得錯誤的一般描述** –

+0

我沒有得到任何錯誤,同時建立我的程序..問題是我應該得到處理鍵和子鍵我可以通過RegOpenKeyEx輸入。但我得到未使用的值0 * 00000f0作爲輸出。 – user1784636

+0

你在'LONG openRes'中獲得了什麼?如果這不是零,那是一個錯誤代碼。當然在這種情況下,你不會得到一個有效的句柄。 –

回答

2

第一:您應該檢查的RegOpenKeyEx結果。請仔細閱讀文檔。如果它們在運行時發生,它確實需要處理錯誤。

第二個:請看看功能RegQueryMultipleValues的文檔。 只需注意val_list參數和lpValueBuf參數都是out參數。我看不到你在代碼中以正確的方式處理它們。

第三:我在網上找不到任何使用RegQueryMultipleValues的樣本。我打了一個小圓桌並創建了一個實例。

這是我做的樣品。

#include <Windows.h> 
#include <string> 
#include <stdlib.h> 

#define MY_KEY TEXT("SYSTEM\\CurrentControlSet\\services\\BITS") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HKEY hKey; 
    LONG lResult; 

    lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, MY_KEY, 0, KEY_READ, &hKey); 

    if(lResult == ERROR_SUCCESS) 
    { 
     VALENT val_list[4]; 
     memset(val_list, 0, sizeof(val_list)); 

     val_list[0].ve_valuename = TEXT("ImagePath"); 
     val_list[1].ve_valuename = TEXT("Start"); 
     val_list[2].ve_valuename = TEXT("DisplayName"); 
     val_list[3].ve_valuename = TEXT("FailureActions"); 

     DWORD totalsize = 0; 

     RegQueryMultipleValues(hKey, val_list, sizeof(val_list)/sizeof(VALENT), NULL, &totalsize); 

     LPWSTR lpBuffer = (LPWSTR)malloc(totalsize); 
     if (lpBuffer == NULL) 
     { 
      // TODO: Error handling 
     } 

     lResult = RegQueryMultipleValues(hKey, val_list, sizeof(val_list)/sizeof(VALENT), lpBuffer, &totalsize); 
     if (lResult == ERROR_SUCCESS) 
     { 
      for (int i = 0; i < sizeof(val_list)/sizeof(VALENT); i++) 
      { 
       DWORD len = val_list[i].ve_valuelen; 
       DWORD *ptr = (DWORD *)val_list[i].ve_valueptr; 

       if (val_list[i].ve_type == REG_SZ || val_list[i].ve_type == REG_EXPAND_SZ) 
       { 
        printf("len:%d content:\"%S\"\n", len, ptr); 
       } 
       else if (val_list[i].ve_type == REG_DWORD) 
       { 
        printf("len:%d content:\"%08x\"\n", len, *ptr); 
       } 
       else if (val_list[i].ve_type == REG_BINARY) 
       { 
        printf("len:%d\n", len); 
        for (unsigned k = 0; k < len; k++) printf("%02x ", ((BYTE *)ptr)[k]); 
       } 
       else 
       { 
        // TODO: implement more 
       } 
      } 
     } 

     free(lpBuffer); 
     RegCloseKey(hKey); 
    } 
    else 
    { 
     // TODO: Error handling 
    } 

    return 0; 
} 

說實話我看來這功能在註冊表中獲取信息的最佳選擇。更好的是你應該使用像RegQueryValueEx這樣的函數。

+0

它應該將結果存儲在szValueBuf中。我是否正確? – user1784636

+0

您需要初始化'VALENT'結構,並且需要爲結果保留足夠的內存。在我的答案中,您可以找到一個特殊的RegistryKey的工作示例。 –

+0

是的..我試着按照你的方式做它..那麼工作..現在唯一的問題是,我不應該得到數字值,我應該能夠打印特定vlaue包含數據的字符串。 – user1784636