RegEnumKeyExについて

解決


どら  2005-01-21 07:00:36  No: 56088

どもども。

RegEnumKeyExを使って、アンインストール情報からDisplayNameとDisplayVersionを片っ端から取得する関数を作っています。
とりあえずメッセージボックスに次々と表示させるように作っているんですが・・・。

RegEnumKeyEx関数のヘルプを見て気になっていることがあります。

サブキーはインデックス番号の順に配置されているわけではないので、新しいサブキーを作成した場合、任意のインデックス番号が割り当てられます(現在の最大のインデックス番号に 1 を足した値とは限りません)。言い換えると、この関数で指定したインデックス番号と、返されるサブキーの間に直接の関係はなく、実行してみるまでは、どのサブキーが返されるのかわかりません。 

と書かれているんです。
つまり、0から初めて、インクリメントをしてRegEnumKeyEx関数を実行しても、途中でキーが割り当てられていないところがあって、そこで取得が終わってしまうのでは・・・?と思っているんです。

以下のような関数の内容なのですが、2つ取得した時点で終わってしまいました。
私のソースに問題があるのかもしれませんが・・・

どなたかご存じの方、知恵を貸してください!!

こんな関数です・・・

BOOL GetInstalledApp(HWND hWnd, LPCSTR SaveFileName)
{
  FILETIME ft;
  DWORD lpcName;
  int n = 0;
  HKEY hKey, hKeyCurrent;
  LONG Result;
  char AppName[256];
  char AppVersion[32];
  char CurrentSubKey[256];

  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
  {
    return FALSE;
  }

  while(1)
  {

    Result = RegEnumKeyEx(hKey, n, CurrentSubKey, &lpcName, NULL, NULL, NULL, &ft);
    if(Result == ERROR_NO_MORE_ITEMS)
    {
      MessageBox(hWnd, "終わり", "終わり", MB_OK);
      break;
    }
    else if(Result == ERROR_SUCCESS)
    {
      MessageBox(hWnd, CurrentSubKey, "どう?", MB_OK);

      Result = RegOpenKeyEx(hKey, CurrentSubKey, 0, KEY_READ, &hKeyCurrent);
      if(Result != ERROR_SUCCESS)
      {
        MessageBox(hWnd, "サブキーのオープンに失敗", CurrentSubKey, MB_OK);
        RegCloseKey(hKey);
        return FALSE;
      }
      else
      {
        MessageBox(hWnd, "サブキーのオープンに成功", CurrentSubKey, MB_OK);
      }

      if(EmxGetRegString("DisplayName", AppName, sizeof(AppName), hKeyCurrent) == TRUE)
      {
//        MessageBox(hWnd, AppName, AppName, MB_OK);
        if(EmxGetRegString("DisplayVersion", AppVersion, sizeof(AppVersion), hKeyCurrent) == TRUE)
        {
          MessageBox(hWnd, AppName, AppVersion, MB_OK);
        }
        else
        {
          sprintf(AppVersion, "バージョン情報無し");
          MessageBox(hWnd, AppName, AppVersion, MB_OK);
        }
      }
      RegCloseKey(hKeyCurrent);
    }

    n++;

  }
  RegCloseKey(hKey);

  return TRUE;
}


YuO  2005-01-21 07:55:08  No: 56089

lpcNameに正しい値が設定されていないからでしょう。
MSDNをちゃんと読めばわかりますが,lpcNameは[in, out]です。
http://msdn.microsoft.com/library/en-us/sysinfo/base/regenumkeyex.asp
最初に,lpNameが指すバッファ長をちゃんと指定してやる必要があります。
というか,ちゃんとresultの値を吟味すればわかった話だと思います。

それから,番号に抜けはありません。
単純に,作った順に取得できるわけではない,というのがdwIndexのヘルプが言っていることです。


どら  2005-01-21 19:11:57  No: 56090

YuOさん

早速のご回答、ありがとうございます。
> lpcNameに正しい値が設定されていないからでしょう。
> MSDNをちゃんと読めばわかりますが,lpcNameは[in, out]です。
http://msdn.microsoft.com/library/en-us/sysinfo/base/regenumkeyex.asp
> 最初に,lpNameが指すバッファ長をちゃんと指定してやる必要があります。
> というか,ちゃんとresultの値を吟味すればわかった話だと思います。

lpcName = sizeof(CurrentSubKey);

ですね☆
解決しました。
ありがとうございました。

> それから,番号に抜けはありません。
> 単純に,作った順に取得できるわけではない,というのがdwIndexのヘルプが言っていることです

そうだったんですか・・・・
.netのライブラリ(日本語版)だと、その用にとりにくい書き方がされていると思うのは、私だけでしょうか・・・。
やっぱり、英語版の最新を見た方がいいんですかね?

YuOさん、いつもいつも本当にありがとうございます。
勉強になります。


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

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






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