- - PR -
VC.NET でのRegOpenKeyExの戻り値について
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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); | ||||||||||||
|
投稿日時: 2004-02-21 13:21
諸農です。
この戻り値の意味は調べられたのでしょうか? アップされているコードですが、RegOpenKeyとRegQueryValueExで 同じ変数を戻り値格納用に使われているようですが、上記のエラー はOpen時に発生している戻り値なんでしょうか?
.NETであるならRegistryクラスも使えますので、 検討されてみてはいかがですか? _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 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を返すので権限も問題あるのか調べていました。 | ||||||||||||
|
投稿日時: 2004-02-21 15:34
諸農です。
Win95って.NET対象環境でしたっけ? というか、そもそも、.NETが導入されているかどうかを判定した いってことなんですよね? Win95に関してはバージョンチェックで何とかなりそうですけど。
とのことですが、こちらで以下のキーとバリューを用いて アップされていたコードを試したところ、 Openの方ではなく、RegQueryValueExのほうで ERROR_INVALID_PARAMETERが返ってきましたね。 キー:"SOFTWARE\\Microsoft\\.NETFramework" バリュー:"InstallRoot" もう少しデバッグを重ねてみてはいかがでしょうか。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-02-21 17:05
RegQueryValueExのキータイプ(第4引数)とキー長(第6引数)が指定されていないからだと思います。
以下の例はVC++6のMFCでのコードですのでCStringなど使っていますが適当に読み替えて下さい。
実際には戻りの値はチェックします。 因みに、プラットフォームSDK の RegQueryValueEX の説明には [参照] 関数が成功すると、ERROR_SUCCESS が返ります。 関数が失敗すると、WINERROR.H ヘッダファイルで定義された、0 以外のエラーコードが返ります。FORMAT_MESSAGE_FROM_SYSTEM フラグを指定して FormatMessage 関数を呼び出すと、エラーの一般的な説明が取得できます。 [/参照] とあり、WINWRROR.Hには // The parameter is incorrect. // #define ERROR_INVALID_PARAMETER 87L // dderror と定義されています。 | ||||||||||||
|
投稿日時: 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; } | ||||||||||||
|
投稿日時: 2004-02-21 19:33
諸農です。
変なところで噛みついてしまいますが(^^
この場合、ERROR_INVALID_PARAMETERにはならずにERROR_BAD_PATHNAMEに なりませんか?もしかして違う処理系なんでしょうか?
問題点がすり替わっていませんか? そもそも、ここは.NET関連の会議室のはずです。 .NETがインストールされているされていないを判定する方法についての議論なら、 ログとしても有益な情報になるかと思うのですが。。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-02-21 19:38
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
