C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: レジストリから値の取得が出来ない


(過去ログ 171 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■98506 / inTopicNo.1)  レジストリから値の取得が出来ない
  
□投稿者/ ばんじ (8回)-(2021/11/25(Thu) 23:26:34)

分類:[C/C++] 

レジストリから値を取得できません。
waReadBufに自分(ソースコード)のexeのpathが入っており、if (ERROR_SUCCESS != dwResult)でエラー処理され、
キーハンドル(hKey)の中はnullでした。どこに問題があるのでしょう?
よろしくお願いします。

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <windows.h>

int _tmain
(
int argc
, _TCHAR* argv[]
)
{
// std::wcoutのロケールを設定
std::wcout.imbue(std::locale("", std::locale::ctype));

// エラーコード
HRESULT hResult = S_OK;

{
// 戻り値
DWORD dwResult = 0;

// HKEY
HKEY hKey = NULL;

/*
レジストリオープン
*/
dwResult = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE // レジストリキー
, L"SOFTWARE\\Microsoft\\Internet Explorer" // レジストリサブキー
, 0 // Reserved(0固定)
, KEY_QUERY_VALUE // アクセス権
| KEY_WOW64_64KEY // 64bitレジストリ
, &hKey // キーハンドルの受け取り位置
);
if (ERROR_SUCCESS != dwResult) {

// エラー
hResult = ::HRESULT_FROM_WIN32(dwResult);

}


// データの読出しバッファ
TCHAR waReadBuf[MAX_PATH];

// データの読出しバッファのサイズ(文字数では無くバイト数) / 読みだしたサイズ
DWORD dwReadSize = sizeof(waReadBuf);

// 読みだしたデータのタイプ(RegEnumValue)
DWORD dwType = 0;


/*
レジストリの値を取得
InternetExprolerのバージョン情報
*/
dwResult = ::RegQueryValueEx(
hKey // キーハンドル
, L"svcVersion" // ValueName
, 0 // Reserved(0固定)
, &dwType // 読みだしたデータの型
, (LPBYTE)waReadBuf // 読みだし位置
, &dwReadSize // Input: 読み出しバッファサイズ / Output読みだしたサイズ
);
if (ERROR_SUCCESS != dwResult) {

// エラー
hResult = ::HRESULT_FROM_WIN32(dwResult);
goto err;
}


/*
読みだした内容の出力
*/
std::wcout << L"読みだした値 = " << waReadBuf << std::endl;
std::wcout << L"読みだしたサイズ = " << dwReadSize << std::endl;
std::wcout << L"読みだしたデータの型 = ";
switch (dwType) {
case REG_BINARY: std::wcout << L"REG_BINARY"; break;
case REG_DWORD: std::wcout << L"REG_DWORD / REG_DWORD_LITTLE_ENDIAN"; break;
case REG_DWORD_BIG_ENDIAN: std::wcout << L"REG_DWORD_BIG_ENDIAN"; break;
case REG_EXPAND_SZ: std::wcout << L"REG_EXPAND_SZ"; break;
case REG_LINK: std::wcout << L"REG_LINK"; break;
case REG_MULTI_SZ: std::wcout << L"REG_MULTI_SZ"; break;
case REG_NONE: std::wcout << L"REG_NONE"; break;
case REG_QWORD: std::wcout << L"REG_QWORD / REG_QWORD_LITTLE_ENDIAN"; break;
case REG_RESOURCE_LIST: std::wcout << L"REG_RESOURCE_LIST"; break;
case REG_SZ: std::wcout << L"REG_SZ"; break;
}
std::wcout << std::endl;

err:
// キーハンドルの破棄
if (NULL != hKey) {
::RegCloseKey(hKey);
}
}

// 処理結果を返す
return(0);
}
引用返信 編集キー/
■98507 / inTopicNo.2)  Re[1]: レジストリから値の取得が出来ない
□投稿者/ とっちゃん (750回)-(2021/11/26(Fri) 01:01:50)
No98506 (ばんじ さん) に返信
> レジストリから値を取得できません。
> waReadBufに自分(ソースコード)のexeのpathが入っており、if (ERROR_SUCCESS != dwResult)でエラー処理され、
> キーハンドル(hKey)の中はnullでした。どこに問題があるのでしょう?
> よろしくお願いします。

実際にプロジェクトを作って試したわけじゃないので、実際の動作はわかりませんが

hKey が NULL ということですか?
であれば、オープンに失敗しているので、RegQueryValueEx せずに、エラーチェックしないと意味がないと思います。

RegOpenKeyExが失敗しているのであれば、KEY_QUERY_VALUE ではなく、KEY_READ にしてみてください。

引用返信 編集キー/
■98510 / inTopicNo.3)  Re[2]: レジストリから値の取得が出来ない
□投稿者/ ばんじ (9回)-(2021/11/26(Fri) 12:29:03)
HKEY hKey = NULLをHKEY hKey;にしたらできました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -