2013-10-09 52 views
1

我有以下代碼:顯示值名稱和使用RegEnumValue數據 - C++

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


using namespace std; 

int main(int argc, wchar_t*argv[]) 
{ 

    std::locale::global(std::locale("spanish")); 


    /*Declaración de variables*/ 

    HKEY hKey = HKEY_CURRENT_USER; 
    LPCTSTR lpSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU"); 
    DWORD ulOptions = 0; 
    REGSAM samDesired = KEY_READ | KEY_WRITE; 
    HKEY phkResult; 
    DWORD dwIndex = 0; 
    TCHAR lpValueName[16383]; 
    DWORD lpcchValueName = 16383; 
    LPTSTR lpData=""; 

    long OpenK = RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &phkResult); 

    if (OpenK == ERROR_SUCCESS) 
    { 
     long R = RegEnumValue(phkResult, dwIndex, lpValueName, &lpcchValueName, NULL, NULL,(LPBYTE)lpData, NULL); 


     if (R == ERROR_SUCCESS) 
     { 
      cout << "The value and data is: \n" << lpValueName << ": " << lpData << endl; 
      //printf(TEXT("(%d) %s\n"), lpValueName); 
     } 
     else 
      cout << "Error: " << R << endl; 

    } 
    else if (OpenK == ERROR_FILE_NOT_FOUND) 
    { 
     cout << "La sub-clave RunMRU no existe." << endl; 
    } 
    else if (OpenK == ERROR_ACCESS_DENIED) 
    { 
     cout << "Acceso denegado al abrir la sub-clave RunMRU." << endl; 
    } 
    else 
    { 
     cout << "Error al abrir la clave de registro. Código: " << OpenK << endl; 

    } 


    system("Pause"); 


} 

我試圖同時顯示,使用在第一個RegEnumValue值名稱和它的數據,如果(該值和數據是:)但我只能顯示值名稱。

有沒有辦法做到這一點?我試圖找出如何使用lpData,但我不能,因爲我只收到錯誤87(不正確的參數)或沒有(如果我設置NULL)。

謝謝!

回答

2

您不提供用於存儲數據的合適緩衝區RegEnumValue()

LPTSTR lpData=""; 

這只是一個字符串文字,最多2個字節的大小,而且幾乎肯定不能寫。您需要分配一個內存區域並將其傳遞給RegEnumValue()以讀取每個值的數據。

您的第一步應該是使用RegQueryInfoKey()來了解最大數據值有多大。我向您展示瞭如何在previous answer中使用此函數來查詢最大值名稱的大小 - 過程是相同的。查看RegQueryInfoKey()的文檔以找出哪個參數提供了數據大小。

一旦你知道你最大的數據項目有多大,分配緩衝區爲它:

void* pData = malloc(dwLargestValueSize); 
// remember this buffer needs to be freed at the end with free() 

然後,您可以通過該緩衝區,加上指示值的大小,RegEnumValue()

你需要注意的是註冊表值可以是不同的類型 - REG_DWORDREG_SZ等,你從RegEnumValue()得到的數據是原始數據。 RegEnumValue()也可以返回一個指示數據類型的值,如果你要正確解釋它,你絕對需要檢查這個。

+0

Jonathan,我需要使用lpcMaxValueLen變量嗎?如果是這樣,緩衝區會有這個值? (pData = malloc(lpcMaxValueLen),那個值是RegEnumValue的lpData? –