こんにちは。早速質問です。
僕は、今、パソコンにインストールされているプログラム名を列挙して、
テキストファイルに保存するプログラムを作っているんですが、
プログラムを列挙するところでつまずいています。
その部分のプログラムを載せます。
見にくいかもしれませんが、よろしくお願いします。
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が
出てくるのが問題だと思うんですが…。
どなたかご回答をお願い致します。
本当に見にくくて、申し訳ないです。
あと、過去ログを見て、何とかここまで進歩したんですが、
ここからはさっぱりです…。
で?
regf が ERROR_SUCCESS でもなく ERROR_NO_MORE_ITEMS でもない場合は
あるのか、ある場合それは何か確認しましたか?
それからレジストリはオープンしたらきちんと閉じましょう。
(特にループ中の処理を見直してください。)
> サブキーを全部見ていないのに
そう判断した理由は何ですか?
RegQueryInfoKey()関数での値は確認しましたか?
PAPTさん、返信遅れてすいません。
やっと、完成しました!!
bufの値が毎回変わっていることに、やっと気づきました。
> それからレジストリはオープンしたらきちんと閉じましょう。
これは、hregkey2を毎回、for文の最後で閉じればよろしいんでしょうか?
(訂正 TERはTERUの間違いです。すいません)
> > それからレジストリはオープンしたらきちんと閉じましょう。
> これは、hregkey2を毎回、for文の最後で閉じればよろしいんでしょうか?
そのとおり。
else if(regf == ERROR_SUCCESS)
ブロック内で hRegKey2 がOpenされています。
当該ブロック内で完結しているので、閉じるべきです。
# でないとリソースリークします。たしか。
(追記)
んで、最後の
> RegCloseKey(hRegkey2);
は不要になります。
上記のコードだけでは最後にOpenされたキーのみしか閉じされていない事に
注意してください。
# Subkeyの値が変化するのでOpenされるキーは変化します。
あっ、なるほど!
ご親切にお答えいただき、ありがとうございます!
すでにお気づきかもしれませんが、ちょっと語弊がありそうなので修正。
> > これは、hregkey2を毎回、for文の最後で閉じればよろしいんでしょうか?
> そのとおり。
としましたが、Close は、
else if(regf == ERROR_SUCCESS)
ブロックの最後で行なってください。
はい、それは大丈夫です!
僕も、紛らわしい書き方をしまして
申し訳ないです。
ツイート | ![]() |