InsertRichEditText(b, d); \
} \
+#define ADD_TEXT_NEWL(a, b) \
+ LoadStringW(hInst, a, szText, _countof(szText)); \
+ InsertRichEditText(L"\n", 0); \
+ InsertRichEditText(szText, b); \
+ InsertRichEditText(L"\n", 0);
+
#define GET_STRING1(a, b) \
if (!ParserGetString(a, b, _countof(b), FindFileData.cFileName)) \
continue;
if (!ParserGetString(a, b, _countof(b), FindFileData.cFileName)) \
b[0] = '\0';
+//App is "installed" if the RegName is in the registry
+#define APP_INSTALL_CHECK_K(Info, key) \
+ (*Info->szRegName && (IsInstalledApplicationEx(Info->szRegName, FALSE, key) \
+ || IsInstalledApplicationEx(Info->szRegName, TRUE, key)))
+
+//Check both registry keys in 64bit system
+//TODO: check system type beforehand to avoid double checks?
+#define APP_INSTALL_CHECK(Info) \
+ (APP_INSTALL_CHECK_K(Info, KEY_WOW64_32KEY) || APP_INSTALL_CHECK_K(Info, KEY_WOW64_64KEY))
+
LIST_ENTRY CachedEntriesHead = { &CachedEntriesHead, &CachedEntriesHead };
PLIST_ENTRY pCachedEntry = &CachedEntriesHead;
if (!Info) return FALSE;
NewRichEditText(Info->szName, CFE_BOLD);
-
- InsertRichEditText(L"\n", 0);
+ if (APP_INSTALL_CHECK(Info))
+ {
+ ADD_TEXT_NEWL(IDS_STATUS_INSTALLED, CFE_ITALIC);
+ } else
+ {
+ ADD_TEXT_NEWL(IDS_STATUS_NOTINSTALLED, CFE_ITALIC);
+ }
ADD_TEXT(IDS_AINFO_VERSION, Info->szVersion, CFE_BOLD, 0);
ADD_TEXT(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
VOID InitCategoriesList(VOID)
{
- HTREEITEM hRootItem1, hRootItem2;
-
- hRootItem1 = AddCategory(TVI_ROOT, IDS_INSTALLED, IDI_CATEGORY);
- AddCategory(hRootItem1, IDS_APPLICATIONS, IDI_APPS);
- AddCategory(hRootItem1, IDS_UPDATES, IDI_APPUPD);
-
- hRootItem2 = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
- AddCategory(hRootItem2, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
- AddCategory(hRootItem2, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
- AddCategory(hRootItem2, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
- AddCategory(hRootItem2, IDS_CAT_GAMES, IDI_CAT_GAMES);
- AddCategory(hRootItem2, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
- AddCategory(hRootItem2, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
- AddCategory(hRootItem2, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
- AddCategory(hRootItem2, IDS_CAT_EDU, IDI_CAT_EDU);
- AddCategory(hRootItem2, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
- AddCategory(hRootItem2, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
- AddCategory(hRootItem2, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
- AddCategory(hRootItem2, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
- AddCategory(hRootItem2, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
- AddCategory(hRootItem2, IDS_CAT_LIBS, IDI_CAT_LIBS);
- AddCategory(hRootItem2, IDS_CAT_OTHER, IDI_CAT_OTHER);
+ HTREEITEM hRootItem;
+
+ hRootItem = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
+ AddCategory(hRootItem, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
+ AddCategory(hRootItem, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
+ AddCategory(hRootItem, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
+ AddCategory(hRootItem, IDS_CAT_GAMES, IDI_CAT_GAMES);
+ AddCategory(hRootItem, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
+ AddCategory(hRootItem, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
+ AddCategory(hRootItem, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
+ AddCategory(hRootItem, IDS_CAT_EDU, IDI_CAT_EDU);
+ AddCategory(hRootItem, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
+ AddCategory(hRootItem, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
+ AddCategory(hRootItem, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
+ AddCategory(hRootItem, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
+ AddCategory(hRootItem, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
+ AddCategory(hRootItem, IDS_CAT_LIBS, IDI_CAT_LIBS);
+ AddCategory(hRootItem, IDS_CAT_OTHER, IDI_CAT_OTHER);
m_TreeView->SetImageList(hImageTreeView, TVSIL_NORMAL);
- m_TreeView->Expand(hRootItem2, TVE_EXPAND);
- m_TreeView->Expand(hRootItem1, TVE_EXPAND);
- m_TreeView->SelectItem(hRootItem1);
+ m_TreeView->Expand(hRootItem, TVE_EXPAND);
+ m_TreeView->SelectItem(hRootItem);
}
BOOL CreateStatusBar()
return TRUE;
}
- /* Only add a ListView entry if...
- - no RegName was supplied (so we cannot determine whether the application is installed or not) or
- - a RegName was supplied and the application is not installed
- */
- if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE)))
- {
- Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM) Info);
+ Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM) Info);
- ListView_SetItemText(hListView, Index, 1, Info->szVersion);
- ListView_SetItemText(hListView, Index, 2, Info->szDesc);
- }
+ ListView_SetItemText(hListView, Index, 1, Info->szVersion);
+ ListView_SetItemText(hListView, Index, 2, Info->szDesc);
return TRUE;
}
ImageList_AddIcon(hImageListView, hIcon);
DestroyIcon(hIcon);
-
+ /*
if (IS_INSTALLED_ENUM(EnumType))
{
- /* Enum installed applications and updates */
+ / Enum installed applications and updates
EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc);
EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc);
}
- else if (IS_AVAILABLE_ENUM(EnumType))
+
+ else */if (IS_AVAILABLE_ENUM(EnumType))
{
/* Enum available applications */
EnumAvailableApplications(EnumType, s_EnumAvailableAppProc);
return FALSE;
}
-
BOOL
-IsInstalledApplication(LPWSTR lpRegName, BOOL IsUserKey)
+IsInstalledApplicationEx(LPWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow)
{
DWORD dwSize = MAX_PATH, dwType;
WCHAR szName[MAX_PATH];
HKEY hKey, hSubKey;
INT ItemIndex = 0;
- if (RegOpenKeyW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
- L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
+ if (RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, keyWow | KEY_ENUMERATE_SUB_KEYS,
&hKey) != ERROR_SUCCESS)
{
return FALSE;
while (RegEnumKeyExW(hKey, ItemIndex, szName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
- if (RegOpenKeyW(hKey, szName, &hSubKey) == ERROR_SUCCESS)
+ if (RegOpenKeyExW(hKey, szName, 0, keyWow | KEY_READ, &hSubKey) == ERROR_SUCCESS)
{
+
dwType = REG_SZ;
dwSize = sizeof(szDisplayName);
if (RegQueryValueExW(hSubKey,
RegCloseKey(hSubKey);
RegCloseKey(hKey);
return TRUE;
- }
+ }
}
}
-
RegCloseKey(hSubKey);
dwSize = MAX_PATH;
ItemIndex++;
}
-
RegCloseKey(hKey);
return FALSE;
}