[RAPPS] More code improvements

- Replaced some functions with their Wide versions
- Generalized `GetInstalledVersion` function so it could accept NULL
- Minor cleanup

svn path=/branches/GSoC_2017/rapps/; revision=75324
This commit is contained in:
Alexander Shaposhnikov 2017-07-12 22:59:26 +00:00
parent c4527e3a56
commit 8e4e422ba7
6 changed files with 105 additions and 113 deletions

View file

@ -42,44 +42,31 @@ inline BOOL GetString(LPCWSTR lpKeyName, ATL::CStringW& ReturnedString, const AT
} }
return TRUE; return TRUE;
} }
//App is "installed" if the RegName or Name is in the registry
inline BOOL IsAppInstalledKey(PAPPLICATION_INFO Info, REGSAM key)
{
return (!Info->szRegName.IsEmpty()
&& (IsInstalledApplication(Info->szRegName, TRUE, key)
|| IsInstalledApplication(Info->szRegName, FALSE, key)))
|| (!Info->szName.IsEmpty()
&& (IsInstalledApplication(Info->szName, TRUE, key)
|| IsInstalledApplication(Info->szName, FALSE, key)));
}
//Check both registry keys in 64bit system //Check both registry keys in 64bit system
//TODO: check system type beforehand to avoid double checks? //TODO: check system type beforehand to avoid double checks?
inline BOOL IsAppInstalled(PAPPLICATION_INFO Info)
{
return IsAppInstalledKey(Info, KEY_WOW64_32KEY)
|| IsAppInstalledKey(Info, KEY_WOW64_64KEY);
}
//App is "installed" if the RegName or Name is in the registry inline BOOL GetInstalledVersionEx(PAPPLICATION_INFO Info, ATL::CStringW* szVersion, REGSAM key)
inline BOOL GetInstalledVersionWithKey(PAPPLICATION_INFO Info, ATL::CStringW& szVersion, REGSAM key)
{ {
return (!Info->szRegName.IsEmpty() return (!Info->szRegName.IsEmpty()
&& (InstalledVersion(szVersion, Info->szRegName, TRUE, key) && (GetInstalledVersion_WowUser(szVersion, Info->szRegName, TRUE, key)
|| InstalledVersion(szVersion, Info->szRegName, FALSE, key))) || GetInstalledVersion_WowUser(szVersion, Info->szRegName, FALSE, key)))
|| (!Info->szName.IsEmpty() || (!Info->szName.IsEmpty()
&& (InstalledVersion(szVersion, Info->szName, TRUE, key) && (GetInstalledVersion_WowUser(szVersion, Info->szName, TRUE, key)
|| InstalledVersion(szVersion, Info->szName, FALSE, key))); || GetInstalledVersion_WowUser(szVersion, Info->szName, FALSE, key)));
} }
inline BOOL GetInstalledVersion(PAPPLICATION_INFO Info, ATL::CStringW& szVersion) inline BOOL GetInstalledVersion(PAPPLICATION_INFO Info, ATL::CStringW* szVersion)
{ {
return GetInstalledVersionWithKey(Info, szVersion, KEY_WOW64_32KEY) return GetInstalledVersionEx(Info, szVersion, KEY_WOW64_32KEY)
|| GetInstalledVersionWithKey(Info, szVersion, KEY_WOW64_64KEY); || GetInstalledVersionEx(Info, szVersion, KEY_WOW64_64KEY);
} }
inline BOOL IsAppInstalled(PAPPLICATION_INFO Info)
{
return GetInstalledVersion(Info, NULL);
}
LIST_ENTRY CachedEntriesHead = {&CachedEntriesHead, &CachedEntriesHead}; LIST_ENTRY CachedEntriesHead = {&CachedEntriesHead, &CachedEntriesHead};
PLIST_ENTRY pCachedEntry = &CachedEntriesHead; PLIST_ENTRY pCachedEntry = &CachedEntriesHead;
@ -90,7 +77,7 @@ ShowAvailableAppInfo(INT Index)
ATL::CStringW szVersion; ATL::CStringW szVersion;
ATL::CStringW szLicense; ATL::CStringW szLicense;
BOOL bIsInstalled = IsAppInstalled(Info), BOOL bIsInstalled = IsAppInstalled(Info),
bHasVersion = GetInstalledVersion(Info, szVersion); bHasVersion = GetInstalledVersion(Info, &szVersion);
if (!Info) return FALSE; if (!Info) return FALSE;
@ -222,7 +209,6 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
ATL::CStringW szCabPath; ATL::CStringW szCabPath;
PAPPLICATION_INFO Info; PAPPLICATION_INFO Info;
if (!GetStorageDirectory(szPath)) if (!GetStorageDirectory(szPath))
return FALSE; return FALSE;
@ -301,7 +287,6 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
InfoList.AddTail(Info); InfoList.AddTail(Info);
skip_if_cached: skip_if_cached:
if (Info->Category == FALSE) if (Info->Category == FALSE)
continue; continue;
@ -349,10 +334,8 @@ VOID FreeCachedAvailableEntries(VOID)
{ {
Info = InfoList.GetAt(InfoListPosition); Info = InfoList.GetAt(InfoListPosition);
InfoList.RemoveHead(); InfoList.RemoveHead();
/* flush them down the toilet :D */
delete Info;
InfoListPosition = InfoList.GetHeadPosition(); InfoListPosition = InfoList.GetHeadPosition();
delete Info;
} }
} }

View file

@ -22,7 +22,7 @@ class CRichEdit :
public: public:
VOID SetRangeFormatting(LONG Start, LONG End, DWORD dwEffects) VOID SetRangeFormatting(LONG Start, LONG End, DWORD dwEffects)
{ {
CHARFORMAT2 CharFormat; CHARFORMAT2W CharFormat;
SendMessageW(EM_SETSEL, Start, End); SendMessageW(EM_SETSEL, Start, End);

View file

@ -37,12 +37,12 @@ class CMainToolbar :
{ {
HICON hImage; HICON hImage;
if (!(hImage = (HICON) LoadImage(hInst, if (!(hImage = (HICON) LoadImageW(hInst,
MAKEINTRESOURCE(ImageIndex), MAKEINTRESOURCE(ImageIndex),
IMAGE_ICON, IMAGE_ICON,
TOOLBAR_HEIGHT, TOOLBAR_HEIGHT,
TOOLBAR_HEIGHT, TOOLBAR_HEIGHT,
0))) 0)))
{ {
/* TODO: Error message */ /* TODO: Error message */
} }
@ -266,7 +266,7 @@ public:
INT CompareFunc(LPARAM lParam1, LPARAM lParam2, INT iSubItem) INT CompareFunc(LPARAM lParam1, LPARAM lParam2, INT iSubItem)
{ {
ATL::CStringW Item1, Item2; ATL::CStringW Item1, Item2;
LVFINDINFO IndexInfo; LVFINDINFOW IndexInfo;
INT Index; INT Index;
IndexInfo.flags = LVFI_PARAM; IndexInfo.flags = LVFI_PARAM;
@ -366,7 +366,7 @@ class CSearchBar :
public: public:
VOID SetText(LPCWSTR lpszText) VOID SetText(LPCWSTR lpszText)
{ {
SendMessage(SB_SETTEXT, SBT_NOBORDERS, (LPARAM) lpszText); SendMessageW(SB_SETTEXT, SBT_NOBORDERS, (LPARAM) lpszText);
} }
HWND Create(HWND hwndParent) HWND Create(HWND hwndParent)
@ -626,21 +626,31 @@ private:
/* Size tool bar */ /* Size tool bar */
m_Toolbar->AutoSize(); m_Toolbar->AutoSize();
RECT r = {0, 0, LOWORD(lParam), HIWORD(lParam)}; RECT r = {0, 0, LOWORD(lParam), HIWORD(lParam)};
HDWP hdwp = NULL; HDWP hdwp = NULL;
int count = m_ClientPanel->CountSizableChildren(); int count = m_ClientPanel->CountSizableChildren();
hdwp = BeginDeferWindowPos(count); hdwp = BeginDeferWindowPos(count);
if (hdwp) hdwp = m_ClientPanel->OnParentSize(r, hdwp); if (hdwp)
if (hdwp) EndDeferWindowPos(hdwp); {
hdwp = m_ClientPanel->OnParentSize(r, hdwp);
}
if (hdwp)
{
EndDeferWindowPos(hdwp);
}
// TODO: Sub-layouts for children of children // TODO: Sub-layouts for children of children
count = m_SearchBar->CountSizableChildren(); count = m_SearchBar->CountSizableChildren();
hdwp = BeginDeferWindowPos(count); hdwp = BeginDeferWindowPos(count);
if (hdwp) hdwp = m_SearchBar->OnParentSize(r, hdwp); if (hdwp)
if (hdwp) EndDeferWindowPos(hdwp); {
hdwp = m_SearchBar->OnParentSize(r, hdwp);
}
if (hdwp)
{
EndDeferWindowPos(hdwp);
}
} }
BOOL ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT& theResult, DWORD dwMapId) BOOL ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT& theResult, DWORD dwMapId)
@ -781,10 +791,10 @@ private:
EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_ENABLED); EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_ENABLED);
EnableMenuItem(lvwMenu, ID_MODIFY, MF_ENABLED); EnableMenuItem(lvwMenu, ID_MODIFY, MF_ENABLED);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_REGREMOVE, TRUE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_REGREMOVE, TRUE);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_INSTALL, FALSE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, FALSE);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_UNINSTALL, TRUE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_UNINSTALL, TRUE);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_MODIFY, TRUE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, TRUE);
} }
else else
{ {
@ -798,10 +808,10 @@ private:
EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_GRAYED); EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_GRAYED);
EnableMenuItem(lvwMenu, ID_MODIFY, MF_GRAYED); EnableMenuItem(lvwMenu, ID_MODIFY, MF_GRAYED);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_REGREMOVE, FALSE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_REGREMOVE, FALSE);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_INSTALL, TRUE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, TRUE);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_UNINSTALL, FALSE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_UNINSTALL, FALSE);
m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_MODIFY, FALSE); m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, FALSE);
} }
} }
break; break;
@ -905,10 +915,10 @@ private:
case WM_SYSCOLORCHANGE: case WM_SYSCOLORCHANGE:
{ {
/* Forward WM_SYSCOLORCHANGE to common controls */ /* Forward WM_SYSCOLORCHANGE to common controls */
m_ListView->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_ListView->SendMessageW(WM_SYSCOLORCHANGE, 0, 0);
m_TreeView->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_TreeView->SendMessageW(WM_SYSCOLORCHANGE, 0, 0);
m_Toolbar->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_Toolbar->SendMessageW(WM_SYSCOLORCHANGE, 0, 0);
m_ListView->SendMessage(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); m_ListView->SendMessageW(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE));
} }
break; break;
@ -1028,7 +1038,7 @@ private:
} }
DWORD dwDelay; DWORD dwDelay;
SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &dwDelay, 0); SystemParametersInfoW(SPI_GETMENUSHOWDELAY, 0, &dwDelay, 0);
SetTimer(SEARCH_TIMER_ID, dwDelay); SetTimer(SEARCH_TIMER_ID, dwDelay);
} }
break; break;
@ -1186,7 +1196,7 @@ private:
if (!hIcon) if (!hIcon)
{ {
/* Load default icon */ /* Load default icon */
hIcon = (HICON) LoadIcon(hInst, MAKEINTRESOURCEW(IDI_MAIN)); hIcon = (HICON) LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
} }
Index = ImageList_AddIcon(hImageListView, hIcon); Index = ImageList_AddIcon(hImageListView, hIcon);
DestroyIcon(hIcon); DestroyIcon(hIcon);
@ -1208,7 +1218,7 @@ private:
ATL::CStringW szBuffer1, szBuffer2; ATL::CStringW szBuffer1, szBuffer2;
HIMAGELIST hImageListView = NULL; HIMAGELIST hImageListView = NULL;
m_ListView->SendMessage(WM_SETREDRAW, FALSE, 0); m_ListView->SendMessageW(WM_SETREDRAW, FALSE, 0);
if (EnumType < 0) EnumType = SelectedEnumType; if (EnumType < 0) EnumType = SelectedEnumType;
@ -1244,7 +1254,7 @@ private:
if (ListView_GetItemCount(hListView) > 0) if (ListView_GetItemCount(hListView) > 0)
ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE);
SendMessage(hListView, WM_SETREDRAW, TRUE, 0); SendMessageW(hListView, WM_SETREDRAW, TRUE, 0);
} }
public: public:
@ -1253,12 +1263,20 @@ public:
DWORD csStyle = CS_VREDRAW | CS_HREDRAW; DWORD csStyle = CS_VREDRAW | CS_HREDRAW;
static ATL::CWndClassInfo wc = static ATL::CWndClassInfo wc =
{ {
{ sizeof(WNDCLASSEX), csStyle, StartWindowProc, {
0, 0, NULL, sizeof(WNDCLASSEX),
LoadIcon(_AtlBaseModule.GetModuleInstance(), MAKEINTRESOURCE(IDI_MAIN)), csStyle,
LoadCursor(NULL, IDC_ARROW), StartWindowProc,
(HBRUSH) (COLOR_BTNFACE + 1), MAKEINTRESOURCE(IDR_MAINMENU), 0,
L"RAppsWnd", NULL }, 0,
NULL,
LoadIconW(_AtlBaseModule.GetModuleInstance(), MAKEINTRESOURCEW(IDI_MAIN)),
LoadCursorW(NULL, IDC_ARROW),
(HBRUSH) (COLOR_BTNFACE + 1),
MAKEINTRESOURCEW(IDR_MAINMENU),
L"RAppsWnd",
NULL
},
NULL, NULL, IDC_ARROW, TRUE, 0, _T("") NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
}; };
return wc; return wc;

View file

@ -37,27 +37,10 @@ GetApplicationString(HKEY hKey, LPCWSTR lpKeyName, LPWSTR szString)
} }
BOOL BOOL
IsInstalledApplication(const ATL::CStringW &RegName, BOOL IsUserKey, REGSAM keyWow) GetInstalledVersion_WowUser(_Out_opt_ ATL::CStringW* szVersionResult, _In_z_ const ATL::CStringW& RegName, _In_ BOOL IsUserKey, _In_ REGSAM keyWow)
{
HKEY hKey = NULL;
BOOL IsInstalled = FALSE;
ATL::CStringW szPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + RegName;
if (RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
szPath, 0, keyWow | KEY_READ,
&hKey) == ERROR_SUCCESS)
{
IsInstalled = TRUE;
}
RegCloseKey(hKey);
return IsInstalled;
}
BOOL
InstalledVersion(ATL::CStringW& szVersionResult, const ATL::CStringW& RegName, BOOL IsUserKey, REGSAM keyWow)
{ {
HKEY hKey; HKEY hKey;
BOOL bHasVersion = FALSE; BOOL bHasSucceded = FALSE;
ATL::CStringW szVersion; ATL::CStringW szVersion;
ATL::CStringW szPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + RegName; ATL::CStringW szPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + RegName;
@ -65,27 +48,36 @@ InstalledVersion(ATL::CStringW& szVersionResult, const ATL::CStringW& RegName, B
szPath.GetString(), 0, keyWow | KEY_READ, szPath.GetString(), 0, keyWow | KEY_READ,
&hKey) == ERROR_SUCCESS) &hKey) == ERROR_SUCCESS)
{ {
DWORD dwSize = MAX_PATH * sizeof(WCHAR); if (szVersionResult)
DWORD dwType = REG_SZ;
if (RegQueryValueExW(hKey,
L"DisplayVersion",
NULL,
&dwType,
(LPBYTE) szVersion.GetBuffer(MAX_PATH),
&dwSize) == ERROR_SUCCESS)
{ {
szVersion.ReleaseBuffer(); DWORD dwSize = MAX_PATH * sizeof(WCHAR);
szVersionResult = szVersion; DWORD dwType = REG_SZ;
bHasVersion = TRUE; if (RegQueryValueExW(hKey,
L"DisplayVersion",
NULL,
&dwType,
(LPBYTE) szVersion.GetBuffer(MAX_PATH),
&dwSize) == ERROR_SUCCESS)
{
szVersion.ReleaseBuffer();
*szVersionResult = szVersion;
bHasSucceded = TRUE;
}
else
{
szVersion.ReleaseBuffer();
}
} }
else else
{ {
bHasSucceded = TRUE;
szVersion.ReleaseBuffer(); szVersion.ReleaseBuffer();
} }
} }
RegCloseKey(hKey); RegCloseKey(hKey);
return bHasVersion; return bHasSucceded;
} }

View file

@ -159,10 +159,9 @@ BOOL GetApplicationString(HKEY hKey, LPCWSTR RegName, ATL::CStringW& String);
BOOL ShowInstalledAppInfo(INT Index); BOOL ShowInstalledAppInfo(INT Index);
BOOL UninstallApplication(INT Index, BOOL bModify); BOOL UninstallApplication(INT Index, BOOL bModify);
BOOL IsInstalledApplication(const ATL::CStringW& RegName, BOOL IsUserKey, REGSAM keyWow);
VOID RemoveAppFromRegistry(INT Index); VOID RemoveAppFromRegistry(INT Index);
BOOL InstalledVersion(ATL::CStringW& szVersionResult, const ATL::CStringW& RegName, BOOL IsUserKey, REGSAM keyWow); BOOL GetInstalledVersion_WowUser(ATL::CStringW* szVersionResult, const ATL::CStringW& RegName, BOOL IsUserKey, REGSAM keyWow);
/* winmain.cpp */ /* winmain.cpp */
extern HWND hMainWnd; extern HWND hMainWnd;

View file

@ -12,7 +12,7 @@
SETTINGS_INFO NewSettingsInfo; SETTINGS_INFO NewSettingsInfo;
#define IS_CHECKED(a, b) \ #define IS_CHECKED(a, b) \
a = (SendDlgItemMessage(hDlg, b, BM_GETCHECK, 0, 0) == BST_CHECKED) ? TRUE : FALSE a = (SendDlgItemMessageW(hDlg, b, BM_GETCHECK, 0, 0) == BST_CHECKED) ? TRUE : FALSE
BOOL BOOL
ChooseFolder(HWND hwnd) ChooseFolder(HWND hwnd)
@ -32,13 +32,13 @@ ChooseFolder(HWND hwnd)
szBuf.Empty(); szBuf.Empty();
if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED))) if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
{ {
LPITEMIDLIST lpItemList = SHBrowseForFolder(&bi); LPITEMIDLIST lpItemList = SHBrowseForFolderW(&bi);
if (lpItemList && SHGetPathFromIDList(lpItemList, szBuf.GetBuffer(MAX_PATH))) if (lpItemList && SHGetPathFromIDListW(lpItemList, szBuf.GetBuffer(MAX_PATH)))
{ {
szBuf.ReleaseBuffer(); szBuf.ReleaseBuffer();
if (!szBuf.IsEmpty()) if (!szBuf.IsEmpty())
{ {
SetDlgItemTextW(hwnd, IDC_DOWNLOAD_DIR_EDIT, szBuf.GetString()); SetDlgItemTextW(hwnd, IDC_DOWNLOAD_DIR_EDIT, szBuf);
bRet = TRUE; bRet = TRUE;
} }
} }
@ -55,10 +55,10 @@ ChooseFolder(HWND hwnd)
static VOID static VOID
InitSettingsControls(HWND hDlg, PSETTINGS_INFO Info) InitSettingsControls(HWND hDlg, PSETTINGS_INFO Info)
{ {
SendDlgItemMessage(hDlg, IDC_SAVE_WINDOW_POS, BM_SETCHECK, Info->bSaveWndPos, 0); SendDlgItemMessageW(hDlg, IDC_SAVE_WINDOW_POS, BM_SETCHECK, Info->bSaveWndPos, 0);
SendDlgItemMessage(hDlg, IDC_UPDATE_AVLIST, BM_SETCHECK, Info->bUpdateAtStart, 0); SendDlgItemMessageW(hDlg, IDC_UPDATE_AVLIST, BM_SETCHECK, Info->bUpdateAtStart, 0);
SendDlgItemMessage(hDlg, IDC_LOG_ENABLED, BM_SETCHECK, Info->bLogEnabled, 0); SendDlgItemMessageW(hDlg, IDC_LOG_ENABLED, BM_SETCHECK, Info->bLogEnabled, 0);
SendDlgItemMessage(hDlg, IDC_DEL_AFTER_INSTALL, BM_SETCHECK, Info->bDelInstaller, 0); SendDlgItemMessageW(hDlg, IDC_DEL_AFTER_INSTALL, BM_SETCHECK, Info->bDelInstaller, 0);
SetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT), SetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
Info->szDownloadDir); Info->szDownloadDir);