2

私は特定のレジストリパスの下でデータを取得する必要があるコードに取り組んでいます..このために、関数を使用してキーとサブキーを開き、 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);

}

前もって感謝します

4

1 に答える 1

2

最初:の結果を確認する必要がありRegOpenKeyExます。ドキュメントをもっと注意深く読んでください。エラーが実行時に発生した場合、エラーを処理することが本当に必要です。

2 番目:関数RegQueryMultipleValuesのドキュメントを参照してください。val_listパラメータとパラメータの両方に注意しlpValueBufてください。両方とも出力パラメータです。コードでそれらを正しい方法で処理しているとは思えません。

3 番目: Web で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などの関数を使用することをお勧めします。

于 2012-11-12T06:46:11.100 に答える