- PR -

VC.NET でのRegOpenKeyExの戻り値について

1
投稿者投稿内容
いっく☆
常連さん
会議室デビュー日: 2003/11/26
投稿数: 35
投稿日時: 2004-02-21 12:02
こんにちは。VC.NETにてレジストリに.NETFRAMEが入っているかの処理を
行いたいのですがRegOpenKeyExを下記の様に使うと実際にレジストリにキーは存在するのに
戻り値が87でかえってきてしまいます。
どこの指定が間違っているのか教えて下さい。

BOOL bRet;
Ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_sAppRegkey, 0, KEY_READ, &hKey);
if (Ret == 0)
{
Ret=RegQueryValueEx(hKey,g_sAppRegname,NULL,NULL,(LPBYTE)szData, &cbData);

if (Ret == 0)
{ //.NET1.0
RegCloseKey(hKey);
bRet=Z3ESO230LOGPut(sMsg);
return FALSE;
}else
{ //.NET1.0

}

}else
{
RegCloseKey(hKey);
bRet=Z3ESO230LOGPut(sMsg);
return FALSE;
}
RegCloseKey(hKey);
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-21 13:21
諸農です。


引用:

戻り値が87でかえってきてしまいます。



この戻り値の意味は調べられたのでしょうか?

アップされているコードですが、RegOpenKeyとRegQueryValueExで
同じ変数を戻り値格納用に使われているようですが、上記のエラー
はOpen時に発生している戻り値なんでしょうか?

引用:

コード:
BOOL bRet;
	Ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_sAppRegkey, 0, KEY_READ, &hKey);
	if (Ret == 0)
	{
		Ret=RegQueryValueEx(hKey,g_sAppRegname,NULL,NULL,(LPBYTE)szData, &cbData);

		if (Ret == 0)
		{	//.NET1.0
			RegCloseKey(hKey);
			bRet=Z3ESO230LOGPut(sMsg);		
			return FALSE;
		}else
		{	//.NET1.0

		}

	}else
	{
		RegCloseKey(hKey);
		bRet=Z3ESO230LOGPut(sMsg);
		return FALSE;
	}
	RegCloseKey(hKey);






.NETであるならRegistryクラスも使えますので、
検討されてみてはいかがですか?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
いっく☆
常連さん
会議室デビュー日: 2003/11/26
投稿数: 35
投稿日時: 2004-02-21 14:18
レスありがとうございます。
.NETであるならRegistryクラスも使えますので、
検討されてみてはいかがですか?
とのアドバイスですが,今回はOS95も対応なのでだめなんです。
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
この戻り値の意味は調べられたのでしょうか?

調べました。引数に問題がある場合ですよね。
いろいろネット検索はしてみたんですが,,,
アップされているコードですが、RegOpenKeyとRegQueryValueExで
同じ変数を戻り値格納用に使われているようですが、上記のエラー
はOpen時に発生している戻り値なんでしょうか?
RegOpenKey
になります。
ちなみにレジストリエディタを上げた状態で実行すると正常な
戻り値0を返すので権限も問題あるのか調べていました。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-21 15:34
諸農です。

引用:

とのアドバイスですが,今回はOS95も対応なのでだめなんです。



Win95って.NET対象環境でしたっけ?
というか、そもそも、.NETが導入されているかどうかを判定した
いってことなんですよね?
Win95に関してはバージョンチェックで何とかなりそうですけど。

引用:

調べました。引数に問題がある場合ですよね。
いろいろネット検索はしてみたんですが,,,
引用:

はOpen時に発生している戻り値なんでしょうか?


RegOpenKey
になります。
ちなみにレジストリエディタを上げた状態で実行すると正常な
戻り値0を返すので権限も問題あるのか調べていました。



とのことですが、こちらで以下のキーとバリューを用いて
アップされていたコードを試したところ、
Openの方ではなく、RegQueryValueExのほうで
ERROR_INVALID_PARAMETERが返ってきましたね。

キー:"SOFTWARE\\Microsoft\\.NETFramework"
バリュー:"InstallRoot"

もう少しデバッグを重ねてみてはいかがでしょうか。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-21 17:05
RegQueryValueExのキータイプ(第4引数)とキー長(第6引数)が指定されていないからだと思います。

以下の例はVC++6のMFCでのコードですのでCStringなど使っていますが適当に読み替えて下さい。
コード:
	CString strValue;
	DWORD dwType, dwCount;
	LONG lResult;

	RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\.NETFramework", 0, KEY_READ, &hKey); 

//   最初にRegQueryValueExでTypeとデータ長を受け取る、第5引数は指定しない
//    キーの存在確認であれば、ここが正しく取れれば良いのでは?
	lResult = RegQueryValueEx(hKey, "InstallRoot", NULL, &dwType,NULL, &dwCount);

//   上で値の入った dwType と dwCount を使い、データを受け取るバッファを指定して再度実行
	lResult = RegQueryValueEx(hKey, "InstallRoot", NULL, &dwType,
			      (LPBYTE)strValue.GetBuffer(dwCount/sizeof(TCHAR)), &dwCount);

//   これでstrValueにキー値が入る(はず..)


実際には戻りの値はチェックします。

因みに、プラットフォームSDK の RegQueryValueEX の説明には
[参照]
関数が成功すると、ERROR_SUCCESS が返ります。
関数が失敗すると、WINERROR.H ヘッダファイルで定義された、0 以外のエラーコードが返ります。FORMAT_MESSAGE_FROM_SYSTEM フラグを指定して FormatMessage 関数を呼び出すと、エラーの一般的な説明が取得できます。
[/参照]
とあり、WINWRROR.Hには

// The parameter is incorrect.
//
#define ERROR_INVALID_PARAMETER 87L // dderror

と定義されています。
いっく☆
常連さん
会議室デビュー日: 2003/11/26
投稿数: 35
投稿日時: 2004-02-21 17:47
RegOpenKeyExでうまくいかなかったのは
Ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_sAppRegkey, 0, KEY_READ, &hKey);の
第2引数が問題でした。sAppRegkeyは,#defineした値ではなく
iniファイルから取得した値だったのですが
型がLPTSTRだからでしょうか?それでうまくいかなかった様です。
そこで,定義ファイルから取得したパスを#defineでプログラム内で
きって実行した所,うまくいきましたが,定義ファイルから取得したこの値を
#defineの様にすることはできないでしょうか?

char g_sAppRegkey[_MAX_PATH];
#define STR_ITEM_REGNAME "SUBREGKEY"//.NET判定キー名称
//.NET判定レジストリキー取得
::GetPrivateProfileString(STR_SECT_APPFILE,STR_ITEM_REGKEY,"",g_sAppRegkey,sizeof(g_sAppRegkey),g_sAppEnvPath);
if (strlen(g_sAppRegkey) == 0)
{
//エラーログファイル出力
strcpy(sMsg,"■.NETレジストリルート・サブキー取得失敗");
return FALSE;
}



Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-21 19:33
諸農です。

変なところで噛みついてしまいますが(^^

引用:

RegOpenKeyExでうまくいかなかったのは
Ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_sAppRegkey, 0, KEY_READ, &hKey);の
第2引数が問題でした。sAppRegkeyは,#defineした値ではなく


この場合、ERROR_INVALID_PARAMETERにはならずにERROR_BAD_PATHNAMEに
なりませんか?もしかして違う処理系なんでしょうか?

引用:

きって実行した所,うまくいきましたが,定義ファイルから取得したこの値を
#defineの様にすることはできないでしょうか?



問題点がすり替わっていませんか?
そもそも、ここは.NET関連の会議室のはずです。
.NETがインストールされているされていないを判定する方法についての議論なら、
ログとしても有益な情報になるかと思うのですが。。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-21 19:38
引用:

いっく☆さんの書き込み (2004-02-21 17:47) より:
RegOpenKeyExでうまくいかなかったのは
Ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_sAppRegkey, 0, KEY_READ, &hKey);の
第2引数が問題でした。sAppRegkeyは,#defineした値ではなく
iniファイルから取得した値だったのですが
型がLPTSTRだからでしょうか?それでうまくいかなかった様です。
そこで,定義ファイルから取得したパスを#defineでプログラム内で
きって実行した所,うまくいきましたが,定義ファイルから取得したこの値を
#defineの様にすることはできないでしょうか?

char g_sAppRegkey[_MAX_PATH];
#define STR_ITEM_REGNAME "SUBREGKEY"//.NET判定キー名称
//.NET判定レジストリキー取得
::GetPrivateProfileString(STR_SECT_APPFILE,STR_ITEM_REGKEY,"",g_sAppRegkey,sizeof(g_sAppRegkey),g_sAppEnvPath);
if (strlen(g_sAppRegkey) == 0)
{
//エラーログファイル出力
strcpy(sMsg,"■.NETレジストリルート・サブキー取得失敗");
return FALSE;
}




RegOpenKeyやRegQueryValueEX以前の問題ですね

1.#defineでなくてもJubeiさんや私が示した様に、キーのパスが判っているなら定数で指定しできないのか
2.RegOpenKeyの第2引数は LPCTSTR ですので、g_sAppRegkeyをLPCSTRにキャストすることで解決できないか

1か2のどちらかでどうですか?

#defineはコンパイル時に判っている値を定義する為のものですから、GetPrivateProfileStringで変数に受け取った値を、プログラムの中で#defineで定義することはできないと思います。

追記
 順番としてキーのパスを常数で指定して、RegOpenKeyやRegQueryValueEXが正しく動作するようにしてから、g_sAppRegkeyをどう扱うか考えるべきだと思いますが..

[ メッセージ編集済み 編集者: Hirashige 編集日時 2004-02-21 20:09 ]
1

スキルアップ/キャリアアップ(JOB@IT)