Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - AutoRilevazione della Directory
Forum - C/C++ - AutoRilevazione della Directory

Avatar
redlion (Normal User)
Newbie


Messaggi: 10
Iscritto: 11/09/2006

Segnala al moderatore
Postato alle 18:34
Martedì, 31/10/2006
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.

Codice sorgente - presumibilmente C#

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



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 il 31/10/2006 alle 18:39


"Una delle principali cause della caduta dell'Impero Romano fu che, privi dello zero, non avevano un modo per indicare la corretta terminazione dei loro programmi C." (Robert Firth)
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:12
Mercoledì, 01/11/2006
Guarda sull'MSDN la funzione:

Codice sorgente - presumibilmente Plain Text

  1. GetModuleFilename();



Credo faccia al caso tuo.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
redlion (Normal User)
Newbie


Messaggi: 10
Iscritto: 11/09/2006

Segnala al moderatore
Postato alle 18:22
Mercoledì, 01/11/2006
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:
Codice sorgente - presumibilmente C/C++

  1. char Path[PATH];
  2.     GetModuleFileName(NULL, Path, PATH);
  3.     cout << "\nQuesta è la directory del programma: ";
  4.     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 è:
Codice sorgente - presumibilmente Plain Text

  1. 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


"Una delle principali cause della caduta dell'Impero Romano fu che, privi dello zero, non avevano un modo per indicare la corretta terminazione dei loro programmi C." (Robert Firth)
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 5:06
Giovedì, 02/11/2006
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:

Codice sorgente - presumibilmente C++

  1. #define SIZE 2048
  2.  
  3. // ...
  4. unsigned int iCurSize = SIZE;
  5. do{
  6.  iCurSize *= 2;
  7.  char *path = new[iCurSize];
  8.  GetModuleFilename(NULL,path,iCurSize);
  9. }while(GetLastError() == ERROR_INSUFFICIENT_BUFFER);



:)


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote