Posts
83
Comments
165
Trackbacks
11
Scorrendo il registro...con C++

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

posted on lunedì 27 novembre 2006 17:36 Print