どもども。
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;
}
lpcNameに正しい値が設定されていないからでしょう。
MSDNをちゃんと読めばわかりますが,lpcNameは[in, out]です。
http://msdn.microsoft.com/library/en-us/sysinfo/base/regenumkeyex.asp
最初に,lpNameが指すバッファ長をちゃんと指定してやる必要があります。
というか,ちゃんとresultの値を吟味すればわかった話だと思います。
それから,番号に抜けはありません。
単純に,作った順に取得できるわけではない,というのがdwIndexのヘルプが言っていることです。
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さん、いつもいつも本当にありがとうございます。
勉強になります。
ツイート | ![]() |