レジストリのサブキーの列挙

解決


TERU  2005-05-24 00:15:22  No: 57513

こんにちは。早速質問です。
僕は、今、パソコンにインストールされているプログラム名を列挙して、
テキストファイルに保存するプログラムを作っているんですが、
プログラムを列挙するところでつまずいています。

その部分のプログラムを載せます。
見にくいかもしれませんが、よろしくお願いします。

char   Subkey[1024];
ULONG  regflag;
HKEY   hRegkey,hRegkey2;
BYTE   *data;
DWORD  datasize,
       buf = sizeof(Subkey),
       index=0;

RegOpenKeyEx(HKEY_LOCAL_MACHINE,
     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
          0, KEY_READ,&hRegkey);

for(;;index++)
{
   regf = RegEnumKeyEx(hRegkey, index, Subkey, &buf,
                                    NULL,NULL,NULL,NULL);

   if(regf == ERROR_NO_MORE_ITEMS)
   {
       MessageBox(hwndp,reinterpret_cast<const char *>    
                                          (Subkey),"test",MB_OK);
       break;
   }
            
   else if(regf == ERROR_SUCCESS)    
   {
      RegOpenKeyEx(hRegkey, Subkey, 0,  
                       KEY_EXECUTE|KEY_READ, &hRegkey2);
      MessageBox(hwndp,"OK","test",MB_OK);
          
       if(
           RegQueryValueEx(hRegkey2, "DisplayName",  
                      NULL,NULL,NULL, &datasize)   == ERROR_SUCCESS 
           &&
           RegQueryValueEx(hRegkey2,"UninstallString",
                       NULL,NULL,NULL,NULL)        == ERROR_SUCCESS 
          )
       {
  data = (BYTE *) malloc(datasize); 
         RegQueryValueEx(hRegkey2,"DisplayName",
                              NULL,NULL, data, &datasize); 
  SendMessage(g_hlist_print, LB_ADDSTRING, 0, 
    (LPARAM)reinterpret_cast<const char *>(data));
       }
   }
}  
          
RegCloseKey(hRegkey);
RegCloseKey(hRegkey2);

僕のパソコンではこれを実行すると、
OKが3回出て、4回目に「ICW」が出て、ループが終了するみたいです。
なぜか、サブキーを全部見ていないのに、ERROR_NO_MORE_ITEMSが
出てくるのが問題だと思うんですが…。
どなたかご回答をお願い致します。


TER  2005-05-24 00:22:37  No: 57514

本当に見にくくて、申し訳ないです。
あと、過去ログを見て、何とかここまで進歩したんですが、
ここからはさっぱりです…。


RAPT  2005-05-24 05:52:39  No: 57515

で?

regf が ERROR_SUCCESS でもなく ERROR_NO_MORE_ITEMS でもない場合は
あるのか、ある場合それは何か確認しましたか?

それからレジストリはオープンしたらきちんと閉じましょう。
(特にループ中の処理を見直してください。)

> サブキーを全部見ていないのに
そう判断した理由は何ですか?
RegQueryInfoKey()関数での値は確認しましたか?


TERU  2005-05-25 08:19:43  No: 57516

PAPTさん、返信遅れてすいません。
やっと、完成しました!!
bufの値が毎回変わっていることに、やっと気づきました。

> それからレジストリはオープンしたらきちんと閉じましょう。
これは、hregkey2を毎回、for文の最後で閉じればよろしいんでしょうか?

(訂正  TERはTERUの間違いです。すいません)


RAPT  2005-05-30 15:11:37  No: 57517

> > それからレジストリはオープンしたらきちんと閉じましょう。
> これは、hregkey2を毎回、for文の最後で閉じればよろしいんでしょうか?
そのとおり。
else if(regf == ERROR_SUCCESS)
ブロック内で hRegKey2 がOpenされています。
当該ブロック内で完結しているので、閉じるべきです。
# でないとリソースリークします。たしか。


RAPT  2005-05-30 15:14:20  No: 57518

(追記)
んで、最後の
> RegCloseKey(hRegkey2);
は不要になります。

上記のコードだけでは最後にOpenされたキーのみしか閉じされていない事に
注意してください。

# Subkeyの値が変化するのでOpenされるキーは変化します。


TERU  2005-05-31 03:52:58  No: 57519

あっ、なるほど!
ご親切にお答えいただき、ありがとうございます!


RAPT  2005-05-31 08:03:29  No: 57520

すでにお気づきかもしれませんが、ちょっと語弊がありそうなので修正。

> > これは、hregkey2を毎回、for文の最後で閉じればよろしいんでしょうか?
> そのとおり。
としましたが、Close は、
else if(regf == ERROR_SUCCESS)
ブロックの最後で行なってください。


TERU  2005-06-02 05:47:28  No: 57521

はい、それは大丈夫です!
僕も、紛らわしい書き方をしまして
申し訳ないです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加