最初:の結果を確認する必要があり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などの関数を使用することをお勧めします。