Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Snapdragon Soung Gen 2 è la piattaforma Qualcomm per i dispositivi audio sempre più integrati nel mondo dell'intelligenza artificiale: al prorpio interno tanta potenza elaborativa per gestire al meglio le necessità d'uso dell'agentic AI
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-03-2009, 14:07   #1
HVDSV
Member
 
Iscritto dal: Apr 2008
Messaggi: 35
[C++]RegQueryValueEx

Vorrei ottenere il valore corrispondente ad una chiave nel registro di windows.


Ho fatto:

Codice:
wchar_t* RegOp::ReadKeyRegistry(LPCTSTR key, wchar_t* def)
{
     HKEY hKey;
     TCHAR result[512];
    
      if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Chiave") ,0,NULL,&hKey) == ERROR_SUCCESS)
      {
          DWORD dwType;
          DWORD dwSize;
          dwSize = sizeof(result);

          if (RegQueryValueEx(hKey, key, 0, &dwType, (LPBYTE)&result, &dwSize) == ERROR_SUCCESS && dwType == REG_SZ)
          {			
			  return  (wchar_t*)result;
          }
          RegCloseKey(hKey);
     }
	  return def;
}

Codice:
wchar_t* prova1 = new wchar_t[256];
wchar_t* prova2 = new wchar_t[256];

prova1 = reg->ReadKeyRegistry(_T("prova1"),_T("ciao"));
prova2 = reg->ReadKeyRegistry(_T("prova2"),_T("pippo"));
Quello che mi aspetto è:
1-prova1= "test1";
2-prova2="test2";

Quello che succede è:

1- in prova1 viene messo il valore che mi aspetto (test1);
2- in prova2 viene messo il valore che mi aspetto (test2), ma prova1 viene modificato con lo stesso valore di prova2(test2)

Che pasticcio sto facendo?
__________________
HVDSV è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2009, 14:33   #2
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
hai commesso un errore concettuale per il quale Gesu Bambino sotto Natale piange: hai restituito il puntatore ad un buffer allocato sullo stack, é una cosa da non fare mai. il motivo é lasciato come esercizio per lo studente

PS: hai anche fatto un po' di macello tra wchar_t e TCHAR; a parte il fatto che in Win32 é preferibile usare WCHAR piuttosto che wchar_t, comunque deciditi: o usi WCHAR o usi TCHAR; nel tuo caso specifico sono la stessa cosa (probabilmente hai la macro UNICODE definita nelle impostazioni di Visual C++, come avviene di default) ma in generale non lo sono.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2009, 19:51   #3
HVDSV
Member
 
Iscritto dal: Apr 2008
Messaggi: 35
Quote:
Originariamente inviato da fero86 Guarda i messaggi
hai commesso un errore concettuale per il quale Gesu Bambino sotto Natale piange: hai restituito il puntatore ad un buffer allocato sullo stack, é una cosa da non fare mai. il motivo é lasciato come esercizio per lo studente

PS: hai anche fatto un po' di macello tra wchar_t e TCHAR; a parte il fatto che in Win32 é preferibile usare WCHAR piuttosto che wchar_t, comunque deciditi: o usi WCHAR o usi TCHAR; nel tuo caso specifico sono la stessa cosa (probabilmente hai la macro UNICODE definita nelle impostazioni di Visual C++, come avviene di default) ma in generale non lo sono.


Purtroppo sui puntatori ho una gran confusione
Se ho capito giusto l'errore è nel restituire il puntatore a una variabile locale, allocata nello stack.
Potrei quindi allocarla nell'heap con una malloc o ho detto una str@@@ ?
E se passassi altri due parametri alla funzione, un buffer in cui mettere il risultato e un size_t per la dimensione GesuBambino si dispererebbe ancor di più?


Il TCHAR mi era scappato . Ma non ho capito che differenza c'è tra wchar_t e WCHAR
__________________
HVDSV è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2009, 21:40   #4
HVDSV
Member
 
Iscritto dal: Apr 2008
Messaggi: 35
Invece di usare una malloc ho utilizzato new.
Così pare funzionante. Casualità?

Codice:
wchar_t* ReadKeyRegistry2(wchar_t* key,wchar_t* def)
{
      HKEY hKey;
     wchar_t*  result = new wchar_t[256];

       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("chiavel) ,0,NULL,&hKey) == ERROR_SUCCESS)
      {
          DWORD dwType;
          DWORD dwSize;
          dwSize = 255; /// sizeof(result);

          if (RegQueryValueEx(hKey, key, 0, &dwType, (LPBYTE)result, &dwSize) == ERROR_SUCCESS && dwType == REG_SZ)
          {	
	   return  result;
          }
          else 
         {
	  int y = GetLastError();

        }
          RegCloseKey(hKey);
     }
	  return def;
}
Quello che adesso non capisco è perché in dwSize se uso sizeof() restituisce 4 e la RegQueryValueEx fallisce
__________________

Ultima modifica di HVDSV : 24-03-2009 alle 21:44.
HVDSV è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2009, 22:53   #5
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Non vorrei dire una min****ta
Credo che succeda perchè new wchar_t[256] alloca 256*sizeof(wchar_t) bytes, ma poi te a RegQueryValueEx gli dici di operare su 255 bytes...
se quella funzione chiede una size in bytes dovresti usare 256*sizeof(wchar_t), come fai implicitamente quando usi new.

In più è ovvio che sizeof( result ) sia 4, perchè è come scrivere sizeof( puntatore ) che è 4!
non dimenticare che in C/C++ gli array sono semplicemente dei puntatori al primo elemento, e il modo giusto per ottenere la grandezza completa è quello che ho scritto sopra... cioè numero di elementi * sizeof( elemento )
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 24-03-2009 alle 23:02.
Tommo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Microsoft riporta in vita Surface Mouse ...
OpenAI porta le funzioni agentiche vocal...
La Cina indaga su DeepSeek e Moonshot: a...
Sono 68.450 gli oggetti oltre i 10 centi...
950 agenti, 210 milioni di token e 21 or...
Dopo quasi 40 anni l'Italia riapre al nu...
Apple Intelligence su macOS 27 potrebbe ...
NVIDIA prepara la grafica del futuro con...
YouTube annuncia nuovi strumenti per per...
Phishing a nome ACI sul bollo auto: una ...
3 mini-PC ASUS per usare l'intelligenza ...
YouTube punta sempre di più sull'...
SILENT HILL: Townfall è finalment...
Ora lo Starter Pack di Netatmo costa 92,...
MediaWorld celebra 35 anni di attivit&ag...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v