Oppure

Loading
31/10/06 17:34
redlion
Salve a tutti, sono stato un po' assente in questi ultimi tempi e quindi ho postato ankora meno, però vedo che questa sezione è sempre molto attiva e quindi vi espongo un piccolo dubbio :D

In poche parole il mio obiettivo è creare una chiave di registro in ...\CurrentVersion\Run (la chiave per intero sta nel codice) e inserirvi come valore una stringa che richiami il programma stesso ad ogni riavvio. (Mi sembra che tempo fa ci fosse stato qualkuno a postare una richiesta sempre sulle regkey).
Ad ogni modo, nel mio tentativo riesco a far funzionare il tutto se (e solo se :D) è l'utente a specificare la directory del programma.

 HKEY hKey; 
 LONG warn; 
 TCHAR RegValue[] = "expl0rer.exe"; 
 BYTE ProgramPath[300];
 int choice = MessageBox(NULL, "Vuoi avviare il file ad ogni riavvio?", "Scelta", MB_ICONASTERISK | MB_YESNO);
 if (choice == IDYES) {
 // crea la chiave
 cout << "\nInserire la directory dove si trova il programma che si vuole far avviare all'avvio di Windows:\nPercorso:  ";
 gets((char*)ProgramPath);
 // l'utente inserisce la path
 
 warn = RegCreateKey(HKEY_LOCAL_MACHINE,"Software\Microsoft\Windows\CurrentVersion\Run",&hKey);
 // gestione errore
 if(warn!= ERROR_SUCCESS) cerr<<"Key non creata";
 warn=RegSetValueEx(hKey,RegValue,0,REG_SZ,ProgramPath,sizeof(ProgramPath)); 
 cout << "\nPeso chiave" << sizeof(ProgramPath) << endl;
 if(warn!= ERROR_SUCCESS) cerr <<"Key non creata"; 
 
 RegCloseKey(hKey); 
 MessageBox(NULL, "Chiave creata", "Yuppi!", MB_OK | MB_ICONEXCLAMATION);

 }


Quello che vorrei è che il programma facesse in modo di "auto-rilevare" la directory in cui si trova e di porla all'interno dell'array ProgramPath (una volta che capisco come rilevare la directory, metterla nella variabile credo sia il meno :D)

Esiste un modo semplice e indolore per farlo?
Thx
Ultima modifica effettuata da redlion 31/10/06 17:39
aaa
31/10/06 23:12
pierotofy
Guarda sull'MSDN la funzione:

GetModuleFilename();


Credo faccia al caso tuo.
Il mio blog: piero.dev
01/11/06 17:22
redlion
Grazie piero, la "funzione funziona" :D perfettamente :k:
Il mio unico problema ora è come definire la lunghezza dell'array che andrà ad essere riempito dal GetModuleFileName...
Ecco un piccolo esempio:
char Path[PATH];
    GetModuleFileName(NULL, Path, PATH);
    cout << "\nQuesta è la directory del programma: ";
    for(int i = 0; i <= PATH; i++) cout << Path[i]; 

Presupponendo che abbia definito il PATH a 50, il risultato sarà la directory del file più altri caratteri totalmente inutili...
C'è un modo per sapere anticipatamente quanto sia grande la directory per ridefinire la lunghezza dell'array che andrà a contenerlo?
Stavo pensando ad un analisi dei caratteri dell'array copiando il Path in un altro array, fino a che non trova un carattere nullo (dato che l'output è:
Directory/file.exe<spazio>caratteri superflui

Ma già se il file viene messo in Documents<spazio>and<spazio>Settings già non va più bene...
Qualke consiglio? :-|
Thx
aaa
02/11/06 4:06
pierotofy
Al tuo posto imposterei una dimensione predefinita abbastanza grande per contenere qualsiasi ipotetico percorso (4096 credo sia sufficente), ma se vogliamo proprio fare le cose in maniera professionale possiamo scrivere qualcosa come:


#define SIZE 2048

// ...
unsigned int iCurSize = SIZE;
do{
 iCurSize *= 2;
 char *path = new[iCurSize];
 GetModuleFilename(NULL,path,iCurSize);
}while(GetLastError() == ERROR_INSUFFICIENT_BUFFER);


:)
Il mio blog: piero.dev