Add --list facility to list installed programs.

Add --remove xxx facility to remove a specific program.
This commit is contained in:
Jeremy White 2001-07-08 20:28:23 +00:00 committed by Alexandre Julliard
parent 01d5e5b071
commit d08c72a5ba
1 changed files with 72 additions and 27 deletions

View File

@ -48,17 +48,13 @@ typedef struct {
char *key;
char *descr;
char *command;
#ifdef USE_MULTIPLESEL
int active;
#endif
} uninst_entry;
uninst_entry *entries = NULL;
int numentries = 0;
int cursel = -1;
struct {
DWORD style;
LPCSTR text;
@ -72,12 +68,72 @@ struct {
#define NUM (sizeof button/sizeof button[0])
int GetUninstallStrings(void);
void UninstallProgram(void);
void ListUninstallPrograms(void)
{
int i;
if (! GetUninstallStrings())
exit(1);
for (i=0; i < numentries; i++)
printf("%s|||%s\n", entries[i].key, entries[i].descr);
}
void RemoveSpecificProgram(char *name)
{
int i;
if (! GetUninstallStrings())
exit(1);
for (i=0; i < numentries; i++)
{
if (strcmp(entries[i].key, name) == 0)
{
entries[i].active++;
break;
}
}
if (i < numentries)
UninstallProgram();
else
{
fprintf(stderr, "Error: could not match program [%s]\n", name);
}
}
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow )
{
MSG msg;
WNDCLASS wc;
HWND hWnd;
/*------------------------------------------------------------------------
** Handle requests just to list the programs
**----------------------------------------------------------------------*/
if (cmdline && strlen(cmdline) >= 6 && memcmp(cmdline, "--list", 6) == 0)
{
ListUninstallPrograms();
return(0);
}
/*------------------------------------------------------------------------
** Handle requests to remove one program
**----------------------------------------------------------------------*/
if (cmdline && strlen(cmdline) > 9 && memcmp(cmdline, "--remove ", 9) == 0)
{
RemoveSpecificProgram(cmdline + 9);
return(0);
}
LoadString( hInst, IDS_APPNAME, appname, sizeof(appname));
wc.style = 0;
@ -109,7 +165,7 @@ int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmd
return msg.wParam;
}
int GetUninstallStrings()
int GetUninstallStrings(void)
{
HKEY hkeyUninst, hkeyApp;
int i;
@ -153,9 +209,7 @@ int GetUninstallStrings()
entries[numentries-1].descr, &displen);
entries[numentries-1].command =
HeapAlloc(GetProcessHeap(), 0, uninstlen);
#ifdef USE_MULTIPLESEL
entries[numentries-1].active = 0;
#endif
RegQueryValueEx(hkeyApp, REGSTR_VAL_UNINSTALLER_COMMANDLINE, 0, 0,
entries[numentries-1].command, &uninstlen);
}
@ -165,7 +219,7 @@ int GetUninstallStrings()
return 1;
}
void UninstallProgram(HWND hWnd)
void UninstallProgram(void)
{
int i;
char errormsg[1024];
@ -177,16 +231,10 @@ void UninstallProgram(HWND hWnd)
HKEY hkey;
#endif
#ifdef USE_MULTIPLESEL
for (i=0; i < numentries; i++)
{
if (!(entries[i].active)) /* don't uninstall this one */
continue;
#else
if (cursel == -1)
return;
i = cursel;
#endif
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.wShowWindow = SW_NORMAL;
@ -205,21 +253,13 @@ void UninstallProgram(HWND hWnd)
RegCloseKey(hkey);
}
#endif
/* update listbox */
numentries = 0;
GetUninstallStrings();
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
else
{
sprintf(errormsg, "Execution of uninstall command '%s' failed, perhaps due to missing executable.", entries[i].command);
MessageBox(0, errormsg, appname, MB_OK);
}
#ifdef USE_MULTIPLESEL
}
#endif
}
LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
@ -327,17 +367,22 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int sel = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
#ifdef USE_MULTIPLESEL
entries[sel].active ^= 1; /* toggle */
#else
cursel = sel;
#endif
SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM)entries[sel].command);
}
}
else
if ((HWND)lParam == button[0].hwnd) /* Uninstall button */
UninstallProgram(hWnd);
{
UninstallProgram();
/* update listbox */
numentries = 0;
GetUninstallStrings();
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
else
if ((HWND)lParam == button[1].hwnd) /* About button */
MessageBox(0, about_string, "About", MB_OK);