4

次のコードがあります。

#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");


}

最初の if (The value and data is:)を使用して、値の名前とそのデータの両方を表示しようとしていRegEnumValueますが、値の名前しか表示できません。

それを行う方法はありますか?の使用方法を理解しようとしていますがlpData、エラー 87 (パラメーターが正しくない) しか表示されないか (代わりに NULL を設定した場合) 何も表示されないため、できません。

4

2 に答える 2

4

RegEnumValue()データを保存するための適切なバッファを提供していません。

LPTSTR lpData="";

これは単なる文字列リテラルで、サイズはせいぜい 2 バイトであり、いずれにせよ、ほぼ確実に書き込み可能ではありません。メモリ領域を割り当て、それを に渡してRegEnumValue()、各値のデータを読み戻す必要があります。

最初のステップはRegQueryInfoKey()、最大データ値の大きさを調べるために使用する必要があります。以前の回答でこの関数を使用して、最大値の名前のサイズを照会する方法を示しました。プロセスは同じです。RegQueryInfoKey()どのパラメーターがデータ サイズを提供するかについては、ドキュメントを参照してください。

最大のデータ項目の大きさがわかったら、それにバッファを割り当てます。

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

次に、そのバッファとそのサイズを示す値を に渡しますRegEnumValue()

他に注意する必要があるのは、レジストリ値はさまざまなタイプREG_DWORD( 、REG_SZなど) である可能性があり、返されるRegEnumValue()データは生データであるということです。RegEnumValue()また、データのタイプを示す値を返すこともできます。それを適切に解釈する場合は、これも必ず確認する必要があります。

于 2013-10-09T01:03:16.330 に答える