PDA

View Full Version : [VB6] Presenza di programma installato


Golden_eagle
03-09-2007, 13:23
Ciao a tutti sono "nuovo" del forum ;)
Ho un piccolo problemino... sto facendo un programma che tra le tante funzioni deve sapere e mostrare se alcuni giochi sono installati. Per ora per provare controllavo la presenza dell'eseguibile principale nel percorso standard d'installazione, ma è evidente che un piccolo cambiamento di path da parte dell'utente nel momento dell'installazione comprometterebbe al non riconoscimento di esso da parte del mio programma. Un esempio di com'è ora:

If Len(Dir$(C:\Programmi\gioco\gioco.exe)) Then
lst1.AddItem ("Gioco dei giochi")
End If

Adesso però che sto perfezionando tutto è ora di risolvere questo problema ma non mi viene in mente niente. L'unica cosa che ho pensato è che si potrebbe andare a cercare nel registro di sistema, ma come? Grazie :)

PS: di VB6 sono abbastanza niubbo (:mc: ) quindi vi prego di darmi una grossa mano :D

andbin
03-09-2007, 15:23
Adesso però che sto perfezionando tutto è ora di risolvere questo problema ma non mi viene in mente niente. L'unica cosa che ho pensato è che si potrebbe andare a cercare nel registro di sistema, ma come? Grazie :)Sicuramente andare a vedere nel registry è una buona soluzione e molto probabilmente ci sono diversi punti in cui l'applicazione ha dei dati.

Se l'applicazione è installata in modo che si "veda" (come molte altre applicazioni) in "Pannello di controllo -> Installazione applicazioni" allora c'è sicuramente una voce sotto:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Se l'applicazione ha dei dati di configurazione allora potrebbero essere sotto:

HKEY_LOCAL_MACHINE\SOFTWARE\nomesocietà\nomeprodotto

o

HKEY_CURRENT_USER\Software\nomesocietà\nomeprodotto

Poi basta che fai tu qualche ricerca nel registry .... purtroppo non dici quali giochi sono e comunque anche se dicessi quali, io non li conosco di certo e non avrei possibilità di verificare.

Golden_eagle
03-09-2007, 15:39
Il mio problema non è sapere cosa c'è da cercare perchè la maggior parte di sti giochi ce li ho installati e posso vedere io stesso, e gli altri volendo posso installarli per provare o andare da amici che ce li hanno. Il mio problema è come fare in controllo in pratica, quindi il codice... supponiamo call of duty 2... anzi no cod2 non lo trovo nel registro del sistema in uninstall anche se in Installazione Applicazioni è presente... bho allora facciamo Call of Duty (l'uno). Si trova qua:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Call of Duty\

Dato che molte applicazioni alla rimozione lasciano comunque la chiave secondo me bisogna agire sui valori. Ce ne sono 2:

DisplayName REG_SZ Call of Duty
UninstallString REG_SZ C:\PROGRA~1\ACTIVI~1\CALLOF~1\Uninstall\Unwise.exe /u C:\PROGRA~1\ACTIVI~1\CALLOF~1\Uninstall\Install.log

Mi sa che bisogna sapere se esiste questo valore... però non saprei, magari in Uninstall cancellano sempre la chiave... boh! Secondo te basta vedere se esiste la chiave oppure proprio il valore? Comunque se mi potresti fare un esempio che equivalga alla stringa di codice nel primo post adattato a Call of Duty di cui ho scritto le info qua sopra poi posso adattarlo per tutti gli altri e te ne sarei grato :)

PS: ho visitato il tuo sito. Complimenti (sia per te che per il sito)! E' semplice, pulito, velocissimo da caricare... ;)

Golden_eagle
04-09-2007, 09:32
UP? :muro: :mc:

Mi serve disperatly :cry:

miguelito
04-09-2007, 16:39
Per l'accesso al registro di windows puoi usare le funzioni RegOpenKey RegCreateKey RegFlushKey facenti parte della libreria advapi32.dll. Per un esempio del loro utilizzo puoi fare riferimento al seguente link:

http://www.enricomilano.it/sintassi.asp?cod=1426

Trovi qualcosa sul loro utilizzo anche sul ben noto MSDN

Golden_eagle
04-09-2007, 16:40
Ho trovato questo in giro ma dopo alcune prove non sono ancora riuscito a trovare se esiste o no una determinata chiave di registro :(

Golden_eagle
05-09-2007, 08:00
Dopo tante prove penso che quella che si avvicini di più alla correttezza sia questa:

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Sub Form_Load()
Const KEY_READ = &H20019
Dim handle As Long
Dim KeyName As String
KeyName = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
If RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_READ, handle) <> ERROR_SUCCESS Then
Label1 = "non esiste proprio"
Else
Label1 = "esiste sisi"
End If
End Sub
Naturalmente ho collocato la libreria API advapi32.dll nella stessa directory del progetto, ma nulla, continua a darmi che la chiave non esiste quando per forza quella chiave esiste :help: :mc: :confused: :eek:

miguelito
05-09-2007, 19:28
Ho provato la funzione e per ciò che mi concerne funziona. Ti posto il codice da me provato invitandoti a controllare in modo particolare i valori assegnati alle variabili HKEY_LOCAL_MACHINE e KEY_READ che ho impostato come da esempio:

Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Integer, ByVal lpSubKey As String, ByVal ulOptions As Integer, ByVal samDesired As Integer, ByRef phkResult As Integer) As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim nomeChiave As String
Dim handle As Integer
Dim HKEY_LOCAL_MACHINE As Integer = &H80000002
Dim KEY_READ As Integer = &H20019

nomeChiave = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

If RegOpenKeyEx(HKEY_LOCAL_MACHINE, nomeChiave, 0, KEY_READ, handle) = 0 Then
MessageBox.Show("Chiave ESISTENTE") 'ERROR_SUCCESS
Else
MessageBox.Show("Chiave INESISTENTE") 'ERRORE COME INDICATO IN Winerror.h
End If

End Sub

Ovviamente devi possedere i diritti d'amministratore per aprire tale chiave ed essa deve essere correttamente presente nel registro. Ma questo credo già lo sai :D