1

Windowsレジストリキーのサブキーを取得して出力するために、ac void関数にこのコードがあります

TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
retCode = RegQueryInfoKey(
        hKey,                    // key handle 
        achClass,                // buffer for class name 
        &cchClassName,           // size of class string 
        NULL,                    // reserved 
        &cSubKeys,               // number of subkeys 
        &cbMaxSubKey,            // longest subkey size 
        &cchMaxClass,            // longest class string 
        &cValues,                // number of values for this key 
        &cchMaxValue,            // longest value name 
        &cbMaxValueData,         // longest value data 
        &cbSecurityDescriptor,   // security descriptor 
        &ftLastWriteTime);       // last write time 

    // Enumerate the subkeys, until RegEnumKeyEx fails.

    if (cSubKeys)
    {
        printf( "\nNumber of subkeys: %d\n", cSubKeys);

        for (i=0; i<cSubKeys; i++) 
        { 
            cbName = MAX_KEY_LENGTH;
            retCode = RegEnumKeyEx(hKey, i,
                     achKey, 
                     &cbName, 
                     NULL, 
                     NULL, 
                     NULL, 
                     &ftLastWriteTime); 
            if (retCode == ERROR_SUCCESS) 
            {
                _tprintf(TEXT("(%d) %s\n"), i+1, achKey);
            }
        }
    } 

すべてのサブキー値を含む配列を返すように変更するにはどうすればよいですか


こんにちはデビッド、あなたの応答に感謝します。vector<string> subkeysこれらのヘッダーを使用すると、エラーなしでコンパイルできません

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <vector>
#include <string>
using namespace std;

私が変更した場合:

vector<TCHAR> getSubKeys(HKEY key)
{
    vector<TCHAR>> subkeys;
    ....
    for (i=0; i<cSubKeys; i++) 
    {
        // get subkey name
        subkeys.push_back(TCHAR>(achKey));
    }
    ....
    return subkeys;
}

この変更で動作しますが、コンソールにベクトルをリストしようとすると t_main 関数で 65000 のような 8 つの (サブキーの数は正しい) 数字が表示されます。あなたのコードで、どうもありがとう

4

1 に答える 1

1

C++ を使用していることを考えると、配列を使用するべきではありません。代わりvector<T>に、適切なデータ構造があります。これらのいずれかを作成して、レジストリ キー文字列を保持します。

vector<string> subkeys;

現在印刷している場所achKeyではなく、次の場所に追加しsubkeysます。

subkeys.push_back(string(achKey));

Unicode 用にビルドしている場合は、wstring代わりに使用してください。

関数は次のようになります。

vector<string> getSubKeys(HKEY key)
{
    vector<string> subkeys;
    ....
    for (i=0; i<cSubKeys; i++) 
    {
        // get subkey name
        subkeys.push_back(string(achKey));
    }
    ....
    return subkeys;
}
于 2012-04-21T13:24:55.010 に答える