|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
[C++ / Windows API] Registro
Ciao,
ho un quesito su windows vista e 7... ho necessità di usare le API per creare, eliminare e modificare alcune chiavi di registro... su windows XP e privilegi amministrativi nessun problema, per quanto riguarda NT6.0 in avanti credo ci sia il problema dell' UAC, che funzioni uso per richiedere i permessi sufficienti a poter lavorare sul registro? Un funzione tipo che utilizzo è: Codice:
LONG res; HKEY hKey = HKEY_LOCAL_MACHINE; // Memory management registry key: char const* lpSubKey = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management"; DWORD ulOptions = 0; // Reserved REGSAM samDesired = KEY_ALL_ACCESS; // Get complete permissions HKEY phkResult; // Out // Open registry key: res = RegOpenKeyExA( hKey, lpSubKey, ulOptions, samDesired, &phkResult ); |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Ti serve solo in un'occasione oppure ti servono privilegi elevati più volte durante l'utilizzo dell'applicazione?
Perché in caso ti servano più volte, ti conviene direttamente richiedere permessi elevati all'avvio dell'applicazione stessa modificando il manifesto dell'eseguibile. Da Visual Studio vai su Progetto - Proprietà - Linker - File manifesto - Livello di esecuzione controllo dell'account utente. Da lì selezioni requireAdministrator. Facendo così, ogni volta che eseguirai l'applicazione, l'UAC ti mostrerà la richiesta per ottenere privilegi elevati. Certo, se si potesse evitare sarebbe meglio, però se ne hai proprio bisogno penso sia la soluzione più veloce ed efficace. PS: non è che non puoi lavorare sul registro con Windows Vista e 7, ci puoi lavorare tranquillamente senza privilegi elevati. Ti servono i privilegi elevati perché stai accedendo ad un ramo del registro che non dovrebbe essere modificato se non da un amministratore, per cui un utente normale non può accedervi
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: Ultima modifica di eraser : 06-05-2010 alle 10:26. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Hai provato a vedere quanto vale res dopo la chiamata a RegOpenKeyExA?
Ti consiglio comunque di usare RegOpenKeyEx. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Quote:
![]()
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
![]() |
![]() |
![]() |
#5 | |||
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
grazie,
Quote:
Quote:
Quote:
|
|||
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se usi esplicitamente la versione "A" o "W" e ti capita di dover cambiare il codice di caratteri poi è un dramma. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Quote:
![]()
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
casini tipo? la definizione delle macro generiche senza il suffisso A o W serve proprio ad evitare i casini, basta usare la macro _T intorno agli string literals e i tipi TCHAR, LPTSTR e LPCTSTR. il consiglio di tomminno é giusto, e comunque su Windows per questioni di performance é preferibile usare le API Unicode piuttosto che quelle ANSI: il kernel lavora comunque in Unicode, quindi le API in versione ANSI introducono un overhead dovuto al fatto che la stringa va convertita in Unicode prima di essere passata alla system call. addirittura esistono alcune API di cui non esiste la versione ANSI, bisogna usare per forza il suffisso W.
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
P.S. ma su windows tutto sto casino per dei privilegi °.° ? |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Quote:
![]() Non ho mai detto che il consiglio sia sbagliato, ho detto che preferisco personalmente esplicitare direttamente quale versione dell'API utilizzare per evitare di trovarmi in situazioni quali quelle dove mi sono trovato - cioè di progetti passati da un PC ad un altro e le API chiamate erano differenti, per cui venivano ad esempio chiamate le versioni ANSI con stringhe Unicode e viceversa. Comunque avete una capacità di tergiversare in questa sezione ![]() ![]() ![]() ![]()
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Quote:
![]() PS: Se non ti va bene neanche la soluzione con quell'API, potresti semplicemente chiedere all'utente di eseguire il programma come amministratore tramite tasto destro. Metti un controllo all'avvio del programma per verificare se si abbiano i privilegi di amministratore e, se il risultato è negativo, mostri un messaggio e chiudi il programma ![]()
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Quote:
![]() ![]()
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Un'altra alternativa è scrivere nel manifest:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6394
|
Esatto, deve creare un file manifest a mano e includerlo nel progetto del Qt Creator
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
|
![]() |
![]() |
![]() |
#18 | |||
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
![]() Quote:
![]() Quote:
|
|||
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
se usi Visual C++ il manifest viene inserito automaticamente nell'eseguibile e per regolarne il contenuto devi lavorare sulle impostazioni del progetto. in un post precedente ti é stato detto esattamente quale impostazione permette di generare un eseguibile che richiede tramite manifest di essere avviato con permessi amministrativi.
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
no infatti, uso QtCreator, quindi credo di doverlo creare da zero.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:57.