Siamo quasi alla fine, il progetto di setup
è quasi pronto (fase di test ) e quindi ho un po' di tempo per postare un po' di
codice.
Come dicevo nel mio ultimo post se si dovesse essere nella condizione
di dover disinstallare una vecchia versione della propria applicazione o
comunque una generica applicazione esiste una chiave nel registro di
sistema che espone il comando, da eseguire dal prompt, che lancia
l'uninstall dell'applicazione.
Giusto per gradire ecco il codice in C++ che esegue questa
operazione
HKEY uninstallKey = NULL;
LONG lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
NULL,
KEY_ENUMERATE_SUB_KEYS,
&uninstallKey);
if (lResult != ERROR_SUCCESS)
return;
DWORD appKeyIndex = 0;
TCHAR appKeyName[256];
DWORD appKeyLength = sizeof(appKeyName);
while (lResult = RegEnumKeyEx(
uninstallKey,
appKeyIndex++,
appKeyName,
&appKeyLength,
NULL,
NULL,
NULL,
NULL)) != ERROR_NO_MORE_ITEMS)
{
appKeyLength = sizeof(appKeyName);
if (lResult != ERROR_SUCCESS)
continue;
HKEY appKey = NULL;
lResult = RegOpenKeyEx(
uninstallKey,
appKeyName,
NULL,
KEY_QUERY_VALUE,
&appKey);
if (lResult == ERROR_SUCCESS)
{
TCHAR displayNameValue[256];
DWORD displayNameValueLength = sizeof(displayNameValue);
lResult =
RegQueryValueEx(
appKey,
_T("DisplayName"),
NULL,
NULL,
(LPBYTE)displayNameValue,
&displayNameValueLength);
if (lResult == ERROR_SUCCESS
&& APPLICATION_NAME == displayNameValue)
{
TCHAR cmd[256];
DWORD cmdValueLength = sizeof(displayNameValue);
lResult = RegQueryValueEx(
appKey,
_T("UninstallString"),
NULL,
NULL,
(LPBYTE)cmd,
&cmdValueLength);
if (lResult == ERROR_SUCCESS)
ExecCmd(cmd,true);
}
try { RegCloseKey(appKey);}
catch (...) {}
}
}
try { RegCloseKey(uninstallKey); }
catch (...) { }
Anche se il c++ è il mio primo amore, e il primo amore non
si scorda mai, ho come l'impressione che utilizzando le classi del
framework sia molto più semplice...proverò!!!
...sovvertiamo le gerarchie...
powered by IMHO 1.3