[Resolu] Ecrire dans la base de registre/conversion

Ecrire dans la base de registre/conversion [Resolu] - C++ - Programmation

Marsh Posté le 21-05-2003 à 09:47:50    

Voici le probleme, j'ecris une adresse IP dans la base de registre mais quand je vais voir ce qui s'y trouve, le contenu ne correspond pas a l'adresse que je voulais ecrire
 

Code :
  1. HKEY hkey;
  2. DWORD dwDisposition;
  3. DWORD dwType, dwSize;
  4. char* texte = (char*) calloc(255, sizeof(char));
  5. strcpy(texte,"192.168.0.2" );
  6. if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
  7.  TEXT("Software\\MyCompany\\My Application " ), 0, NULL, 0, 0, NULL, &hkey, &dwDisposition)==
  8.  ERROR_SUCCESS)
  9. {
  10.  dwType = REG_SZ;
  11.  RegSetValueEx(hkey, TEXT("BACKUPIP" ), 0, dwType,
  12.  (PBYTE)&texte, 12);
  13.  RegCloseKey(hkey);
  14.  AfxMessageBox(CString("ok" ));
  15. }
  16. else
  17.  AfxMessageBox(CString("Pas ok" ));


 
et quand je vais lire manuellement ce qu'il y a dans la BDR, je vois des carres, et si je lis pas mon programme

Code :
  1. HKEY hkey;
  2. DWORD dwDisposition;
  3. DWORD dwType, dwSize;
  4. char* texte = (char*) calloc(255, sizeof(char));
  5. char* texte2 = (char*) calloc(255, sizeof(char));
  6. // Set the default values
  7. strcpy(texte2,"voila" );
  8. m_edit1 = texte2;
  9.  UpdateData(FALSE);
  10. if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\My Company\\My Application" ), 0, NULL, 0, 0, NULL, &hkey, &dwDisposition)==
  11.  ERROR_SUCCESS)
  12. {
  13.  dwType = REG_SZ;
  14.  dwSize = 12;
  15.  RegQueryValueEx(hkey, TEXT("BACKUPIP" ), NULL, &dwType,
  16.   (PBYTE)&texte
  17.   , &dwSize);
  18.   RegCloseKey(hkey);
  19.  AfxMessageBox(CString("ok" ));
  20.  m_edit1 = texte;
  21.  UpdateData(FALSE);
  22. }
  23. else
  24.  AfxMessageBox(CString("Pas ok" ));


j'affiche la valeur lue (texte) dans un edit mais il n'affiche rien.
 
Quelqu'un a deja connu ce probleme ou un similaire??


Message édité par polo021 le 22-05-2003 à 13:50:11
Reply

Marsh Posté le 21-05-2003 à 09:47:50   

Reply

Marsh Posté le 21-05-2003 à 09:59:26    

  RegSetValueEx(hkey, TEXT("BACKUPIP" ), 0, dwType,  
      (PBYTE)&texte, 12);
 
la est l'erreur je pense

Reply

Marsh Posté le 21-05-2003 à 10:06:46    

harf ca aurait eu du mal de fonctionner
je vais ecrire dans

Citation :

My Company


et je lis dans

Citation :

MyCompany


 
 :pfff:  
 
mais sinon maintenant j'arrive a aller relire la bonne valeur par mon programme mais manuellement si je vais voir la valeur dans la BDR y a toujours ces fameux carres. C'est normal?

Reply

Marsh Posté le 21-05-2003 à 10:08:20    

RegSetValueEx(hkey, TEXT("BACKUPIP" ), 0, dwType,  
      (PBYTE)&texte, 12);
 
la est l'erreur je pense

Reply

Marsh Posté le 21-05-2003 à 10:10:27    

ha ben en fait non ca va pour aller relire car si je lis directement apres avoir ecrit, c;est bon mais si je ferme le programme puis le reouvre pour aller ilre ca va pu.
 
chrisbk > je vais regarder a
RegSetValueEx(hkey, TEXT("BACKUPIP" ), 0, dwType,    
     (PBYTE)&texte, 12);  
mais c'est l'exemple type de l'MSDN  :(

Reply

Marsh Posté le 21-05-2003 à 10:10:34    

effectivement viens de verifier dans la msdn, la est l'erreur

Reply

Marsh Posté le 21-05-2003 à 10:11:27    

LONG RegSetValueEx(
  HKEY hKey,
  LPCTSTR lpValueName,
  DWORD Reserved,
  DWORD dwType,
  const BYTE* lpData,
  DWORD cbData
);
 
toi tu passes un char ** (&texte)
 
je doute fort que l'exemple de la msdn utilise une variable nommee "texte" mais bon

Reply

Marsh Posté le 21-05-2003 à 10:27:37    

effectivement, au debut j'avais modifie l'exemple de l'MSDN.
 
Maintenant ca fonctionne.
 
 :jap: Merci beaucoup
 
EDIT : juste une question encore:  
 maintenant j'arrive a aller relire la bonne valeur par mon programme, mais manuellement si je vais voir la valeur dans la BDR y a toujours ces fameux carres. C'est normal?


Message édité par polo021 le 21-05-2003 à 10:30:02
Reply

Marsh Posté le 21-05-2003 à 14:16:31    

j'ai de nouveau un probleme:
 
Mon programme est donc fait pour ecrire et lire dans la base de registre.
 
Si j'ecris une valeur dans ma base de registre avec le code suivant, que je ferme le programme, le reouvre et vais la relire ca fonctionne nickel

Code :
  1. HKEY hkey;
  2. DWORD dwDisposition;
  3. DWORD dwType, dwSize;
  4. BYTE* value = (BYTE*) calloc (20,sizeof(BYTE));
  5. value = (PBYTE)"LUXA";
  6. AfxMessageBox(CString("affichage value" ));
  7. AfxMessageBox((CString)value);
  8. if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
  9.  TEXT("Software\\Companie\\Programme" )
  10.  , 0, NULL, 0, 0, NULL,
  11.  &hkey, &dwDisposition)==
  12.  ERROR_SUCCESS)
  13. {
  14.  dwType = REG_SZ;
  15.  dwSize = 20;
  16.  RegSetValueEx(hkey, TEXT("PPCLocation" ), 0, dwType, 
  17.       (PBYTE)&value, 20);
  18.  RegCloseKey(hkey);
  19.  AfxMessageBox(CString("New value saved" ));
  20. }
  21. else
  22.  AfxMessageBox(CString("Error" ));


 
tandis que si je l'ecris avec le code suivant, que je ferme le pgm , le reouvre et que je vais tenter de relire la valeur, elle ne s'y trouve plus. Voici le code

Code :
  1. HKEY hkey;
  2. DWORD dwDisposition;
  3. DWORD dwType, dwSize;
  4. BYTE* value = (BYTE*) calloc (20,sizeof(BYTE));
  5. char* temp = (char*) calloc(20,sizeof(char));
  6. strcpy(temp,"LUXI" );
  7. int i=0;
  8. while(temp[i]!='\0')
  9. {
  10.  value[i] = temp[i];
  11.  ++i;
  12. }
  13. AfxMessageBox(CString("affichage value" ));
  14. AfxMessageBox((CString)value);
  15. if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
  16.  TEXT("Software\\Companie\\Programme" )
  17.  , 0, NULL, 0, 0, NULL,
  18.  &hkey, &dwDisposition)==
  19.  ERROR_SUCCESS)
  20. {
  21.  dwType = REG_SZ;
  22.  dwSize = 20;
  23.  RegSetValueEx(hkey, TEXT("PPCLocation" ), 0, dwType, 
  24.       (PBYTE)&value, 20);
  25.  RegCloseKey(hkey);
  26.  AfxMessageBox(CString("New value saved" ));
  27. }
  28. else
  29.  AfxMessageBox(CString("Error" ));


 
Quelqu'un sait pourquoi? ou a une idee?


Message édité par polo021 le 21-05-2003 à 14:19:36
Reply

Marsh Posté le 21-05-2003 à 14:23:59    

LONG RegSetValueEx(  
 HKEY hKey,  
 LPCTSTR lpValueName,  
 DWORD Reserved,  
 DWORD dwType,  
const BYTE* lpData,
 DWORD cbData  
);  
 
BYTE* value
 
 RegSetValueEx(hkey, TEXT("PPCLocation" ), 0, dwType,  
          (PBYTE)&value, 20);
 
 
ca marche ca :heink:
 
(et c du code degueu ton truc)

Reply

Marsh Posté le 21-05-2003 à 14:23:59   

Reply

Marsh Posté le 21-05-2003 à 14:40:18    

oui ca marche comme ca, a condition que j'entre ma valeur de la facon suivante :

Code :
  1. value = (PBYTE)"LUXA";


 
Maintenant, si j'arrive a aller chercher ma valeur dans un EDIT ce sera tout bon mais pour l'instant ca ne fonctionne pas.

Reply

Marsh Posté le 21-05-2003 à 14:53:48    

:bounce:  
Comment faire pour convertir la valeur d'un edit (une chaine de char) de facon a obtenir le meme resultat que si j'avais fait
value = (PBYTE)"LUXA";
 
value etant un BYTE*

Reply

Marsh Posté le 21-05-2003 à 15:06:41    

Chapeau pour le meli-mélo de C et C++ [:xp1700]


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 21-05-2003 à 15:07:42    

franchement pour l'instant je m'en fous un peu :o

Reply

Marsh Posté le 21-05-2003 à 15:07:50    

Tetragrammaton IHVH a écrit :

Chapeau pour le meli-mélo de C et C++ [:xp1700]


meme pas, il ferait du C il aurait remplacé  
 

Code :
  1. char* texte2 = (char*) calloc(255, sizeof(char));
  2. strcpy(texte2,"voila" );


 
par
 
texte2 = strdup("voila" );
 
mais bon hein ?

Reply

Marsh Posté le 21-05-2003 à 15:08:16    

polo021 a écrit :

franchement pour l'instant je m'en fous un peu :o  


 
ben ouais mais a relire c franchement infect :O

Reply

Marsh Posté le 21-05-2003 à 15:16:36    

chrisbk a écrit :


texte2 = strdup("voila" );


je connaisais meme pas.

Reply

Marsh Posté le 21-05-2003 à 15:18:13    

merci kayasax mais je pense que c'est pas trop ca.
 
 :jap:

Reply

Marsh Posté le 21-05-2003 à 15:19:46    

chrisbk a écrit :


 
ben ouais mais a relire c franchement infect :O
 


c'est vrai que niveau proprete du code, je suis pas trop au top mais bon ca viendra j'espere.
 
 
Pour mon probleme vous n'avez toujours pas une idee de pourquoi ca marche avec value = (PBYTE)"LUXA";  
mais pas avec une valeur provenant d'un CEdit?

Reply

Marsh Posté le 21-05-2003 à 15:20:45    

polo021 a écrit :


c'est vrai que niveau proprete du code, je suis pas trop au top mais bon ca viendra j'espere.
 
 
Pour mon probleme vous n'avez toujours pas une idee de pourquoi ca marche avec value = (PBYTE)"LUXA";  
mais pas avec une valeur provenant d'un CEdit?


 
attaque ca au debugueur, regarde si tu ressors bien qqchose de CEdit, regarde meme si tu chies pas dans la recuperation dudit CEdit

Reply

Marsh Posté le 21-05-2003 à 15:25:45    

non en fait ca n'a peut etre meme rien a voir. Le probleme c'est que si j'ecrit la valeur dans la BDR et que je la relie tout de suite apres, ca fonctionne mais si je la relie avec une autre instance du programme ilne l'a trouve plus.
Donc je ne compreends plus rien.  
Soit le probleme vient du fait que j'ecris dans le BDR une valeur pas tres bien convertie, soit le probleme est ailleurs mais ou?

Reply

Marsh Posté le 22-05-2003 à 13:37:43    

bon voici la solution qui fonctionne a merveille
LECTURE DANS LA BDR :

Code :
  1. HKEY m_hkey;
  2.  CString m_strSubkey;
  3. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Company\\MDM" ), 0, KEY_ALL_ACCESS, &m_hkey) != ERROR_SUCCESS)
  4.  {
  5.   m_hkey = 0;
  6.   AfxMessageBox(CString("This key does not exist!" ));
  7.  }
  8.  else
  9.  {
  10.   LPCTSTR pcszKey = TEXT("PPCLoc" );
  11.   DWORD dwDataSize = 0;
  12.   DWORD dwType = REG_SZ;
  13.   if(RegQueryValueEx(m_hkey, pcszKey, 0, &dwType, (PBYTE)NULL, &dwDataSize) == ERROR_SUCCESS)
  14.   {
  15.    CString strValue;
  16.    if(RegQueryValueEx(m_hkey, pcszKey, 0, &dwType, (PBYTE)(LPTSTR)strValue.GetBuffer(dwDataSize + 1), &dwDataSize) == ERROR_SUCCESS)
  17.    {
  18.     strValue.ReleaseBuffer();
  19.    m_PPCLoc = strValue;
  20.     UpdateData(FALSE);
  21.    }
  22.    else
  23.    {
  24.     strValue.ReleaseBuffer();
  25.    }
  26.   }
  27.  }
  28.  closeHKEY(m_hkey);


 
ECRITURE DANS LA BDR

Code :
  1. HKEY m_hkey;
  2. DWORD m_dwDisposition;
  3. int m_nSubkeyIndex;
  4. CString m_strSubkey;
  5. HKEY hkeyParent;
  6. LPCTSTR pcszSubkey;
  7. if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Company\\MDM" ), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &m_hkey, &m_dwDisposition) != ERROR_SUCCESS)
  8. {
  9.  AfxMessageBox(CString("Unable to create subkey" ));
  10.  return (false);
  11. }
  12. else
  13. {
  14. //value est la valeur de la cle et name est le nom de la SubKey
  15.  LPCTSTR pcszValue = value;
  16.  if(RegSetValueEx(m_hkey,name, 0, REG_SZ, (PBYTE)pcszValue, (_tcslen(pcszValue) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS)
  17.  {
  18.   AfxMessageBox(CString("Subkey written" ));
  19.   return (true);
  20.  }
  21.  else
  22.  {
  23.   AfxMessageBox(CString("SubKey not written" ));
  24.   return (false);
  25.  }
  26.  }
  27. closeHKEY(m_hkey);


 

Code :
  1. bool closeHKEY(HKEY m_hkey)
  2. {
  3. if(m_hkey)
  4. {
  5.  RegCloseKey(m_hkey);
  6.  m_hkey = 0;
  7.  return TRUE;
  8. }
  9. else
  10.  return false;


 
voila, merci a ceux qui m'ont aide et aux autres aussi.

Reply

Marsh Posté le 22-05-2003 à 13:41:08    

Code :
  1. if(RegSetValueEx(m_hkey,name, 0, REG_SZ, (PBYTE)pcszValue, (_tcslen(pcszValue) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS)


 
j'en pleure de joie, il a enfin cpris que la fonction voulait un BYTE * et pas un BYTE ** :D

Reply

Marsh Posté le 22-05-2003 à 13:49:39    

chrisbk a écrit :

Code :
  1. if(RegSetValueEx(m_hkey,name, 0, REG_SZ, (PBYTE)pcszValue, (_tcslen(pcszValue) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS)


 
j'en pleure de joie, il a enfin cpris que la fonction voulait un BYTE * et pas un BYTE ** :D
 


 :whistle:  y avait aussi quelque gros problemes pour les CString mais c'est resolu aussi  :o  
 
 :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed