Exporter une clé de registre

fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006 - 9 nov. 2006 à 19:23
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 16 nov. 2006 à 22:46
Bonjour,

J'ai un problème et j'aurais besoin d'être rapidement.

Je désire exporter une clé de registre vers un .reg dans un dossier. Je code en MFC en unicode sur VS 2005.

//----------------------------------------------
RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MyCompagny"), 0, KEY_ALL_ACCESS, &hKey );

lRetour = RegSaveKeyEx( hKey, sDestination + m_sFichierRegistre, NULL, REG_LATEST_FORMAT );
                 if( ( lRetour ERROR_ALREADY_EXISTS ) || ( lRetour ERROR_REGISTRY_IO_FAILED ) )
{
    DeleteFile(sDestination + m_sFichierRegistre);

    RegSaveKeyEx( hKey, sDestination + m_sFichierRegistre, NULL, REG_LATEST_FORMAT );

    }//end if
RegCloseKey( hKey );
//----------------------------------------------
avant ce code je donne les droits pour les tokens.

Je n'ai aucune erreur mais mon fichier n'est pas une clé valide.
Si je l'ouvre j'ai quelque chose comme :
//----------------------------------------------
hbin     �10;                      ¨ÿÿÿnk, åÉ�B;÷
�4;Ç�1;    ÿÿÿÿ�3;       �8;)  ÿÿÿÿ�1;   H�2;  x   ÿÿÿÿ�14;       �14;   @   �4;   �7;   MyCompagny�1; þÿÿsk  x   x   �18;   D�1;  �1; �4;„�C;�1;  (�1;      �14;   �2; ø
    �10;�18; �19; �2; �1;�2;     �5;    !�2;   �1A;�18;    ?�1;�2;     �5;    !�2;   �10;�18; �1F; �3; �1;�2;     �5;    #�2;   �1A;�18;   �1;À�1;�2;     �5;    #�2;   �10;�18; ? �F; �1;�2;     �5;     �2;   �1A;�18;    �10;�1;�2;     �5;     �2;   �10;�14; ? �F; �1;�1;     �5;�12;    �1A;�14;    �10;�1;�1;     �5;�12;    �10;$ ? �F; �1;�5;     �5;�15;   É<“:m�19;pîSºe/�14;   �1A;�14;    �10;�1;�1;     �3;    �1;�5;     �5;�15;   É

//----------------------------------------------

au lieu d'avoir un fichier lisible de la même façon que lorsqu'on le fait à la mais dans regedit Exporter

Si quelqu'un pouvait m'aider. Je dois régler ce problème VITE.

Merci d'avance à tous

14 réponses

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
9 nov. 2006 à 23:07
J'avais fait il y a quelques temps (un peu plus de 2 ans) un code pour gérer la  BDR.
Dedans il y avait la sauvegarde de clefs de la BDR au format des fichier .reg
Toutes les types de clefs ne sont pas  gérées, mais pour un début...
Vive le C
Savon
0
fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006
10 nov. 2006 à 05:09
Je suis désolé mais ton lien ne fonctionne.

J'avais déjà examiné ta source et malheureusement, elle ne me convient. Je ne peux pas me permettre de laisser des formats de clef.

Je tien à préciser que le code foctionnait avant avec RegSaveKey. Quand je double clique sur ma clef j ai un message qui me dit quel n'est pas valide

Je dois aussi dire que le .reg doit se restaurer au double clique et/ou RegLoadKeyEx même si les clé n'existe pas

Je sais vraiment plus quoi essayer, mais merci quand même pour la réponse.
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 nov. 2006 à 17:49
Bizare pour le lien, j'ai fait un copier coller pourtant, tant pis, si tu as vu la source...

Pour la sauvegarde, en fichier reg, tu peux l'utiliser, il faut juste que tu rajoutes les quelques formats qui manquent, ca devrait pas etre bien difficile à faire (je les ai pas fait, car je ne les ai jamais utilisé).
Il faut ausi dire que RegSaveKey sauvegarde une clef, mais pas au format des fichiers .reg, donc c'est pour ca qu'il faut que tu le crées toi meme ce format.

Si tu sauves une clef ave RegSaveKey, tu peux la restaurer avec RegLoadKey, mais pas le fichier .reg
Vive le C
Savon
0
fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006
10 nov. 2006 à 19:39
J'ai essayer de la restaurer avec RegLoadKey, mais il ne me crée MyCompagny/Dossier1/SousDossier1 sans aucune de mes clefs.

mais en vrai j ai

MyCompagny/Dossier1
    MyCompagny/Dossier1/SousDossier1
    MyCompagny/Dossier1/SousDossier1/SousSousDossier1

MyCompagny/Dossier2

    MyCompagny/Dossier2/SousDossier1

    MyCompagny/Dossier2/SousDossier1/SousSousDossier1

et plus de sous dossier

avec un bon tas de clef.......
   
j'ai lu à quelque part que c'étais normal que je ne puisse pas lire mon fichier. Mais il ne veux même pas le recréer comme avant  ni  avec RegLoadKey ni avec RegRestoreKey. Et je trouve ça louche !?!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 nov. 2006 à 20:18
Je ne vois pas trop le probleme en fait ;)

Tu as une (ou plusieurs clefs et sous clefs) dans ta bdr.
Tu souhaites les sauvegarder dans un fichier. POur ca, tu utilises RegSaveKey(Ex).
Jusque la d'accord!
Tu vas avoir un fichier illisble puisque sauvegarder brut de brut dans le fichier (sans l'habillage du fichier .reg)
Seule la fonction RegLoadKey pourra le lire (ptet RegRestoreKey aussi, pas vérifier).
Meme si tu nommé le fichier avec l'extension .reg, ca ne pourra pas fonctionner il est pas du tout à la norme de ces fichiers.

Ensuite, tu veux recharger ce ficghier, c'est bien ça?
Comment fais-tu pour recharger le fichier? Quelle est l'erreur qui t'es retournée? ...
Vive le C
Savon
0
fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006
10 nov. 2006 à 20:49
Hihi, je crois que je vais être oubligé de te fournir un peu plus d'explication.

le bug est apparue récement. Le logiciel été (je crois) dévellopé en 98. Une de ses fonctionnalités est de faire une copie de sauvegarde du registre de toute les clé de touts les logiciels dévellopé l'entreprise. Avant RegSaveKey créait un .reg qui pouvait ètre restaurer en double cliquant dessus. Il n'avait pas de fonctionnalité de restauration de cette clé.

Je crois que le problème est apparue avec XP, ça fonctionne juste plus. RegSaveKeyEx ne crée plus un fichier double cliquable et si je restaure le fichier que j'ai céer avec RegLoadKey ou RegRestoreKey, la structure de registre n'est pas recréer correctement et les clef non plus... en vrai il créer que trois dossiers sur plusiers et 0 des clé. Sans aucun message ni exception. Si je double clique dessus
"Le ficher n'est pas un script du registre". Mais avant ça fonctionnait de cette façon.

J'ai deux possibilités, soit je trouve une façon de faire un .reg valide qui est restaurer au double clique ou je trouve comment restaurer mon fichier avec l'app (forçant l'usager à paser par le programme pour la restauration) et les deux conviennent au supérieur

Si tu as une idée

Merci beaucoup pour ce support
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 nov. 2006 à 21:04
Dans RegSaveKeyEx, change le dernier paramètre et met: REG_STANDARD_FORMAT.

Sinon, en regardant un peu ed doc sur RegSaveKeyEx (que je connaissais pas, j'utilisais que RegSaveKey), j'ai vu que:
Pour restaurer le fichier sauvegarder à l'aide de cette fonction, il fallait plusieurs appels à RegRestoreKey, RegDeplaceKey ou RegLoadKey.
Ca expliquerait le fait qu'il ne restaure qu'uine partie des dossiers.
Je vais essayer de regarder un peu plus en détails la fonction RegSaveKeyEx.

Vive le C
Savon
0
fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006
10 nov. 2006 à 21:18
J'ai essayé les 3 options de RegSaveKeyEx et les 3 de RegRestoreKey en combinaison et rien de plus, ça restaure toujours la même chose.

j'ai aussi essayé de faire plusieurs appels et rien de nouveau...
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 nov. 2006 à 23:06
Pour la sauvegarde, j'ai bien la même chose que toi, et le fichier semble correct pour ce que j'ai pu en voir.
Par contre, je bloque sur l'utilisation de RegLoadKey, elle me renvoie sans cesse un message d'erreur me disant que je n'ai pas les droits d'acces, mais je ne sais pas à quoi je n'ai pas le droit d'accéder :( (J'ai deja vérifier les problemes de privilege ce n'est pas ca).
Je t'en dit plus demain
Vive le C
Savon
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 nov. 2006 à 23:56
Euh....
Je viens de faire un petit prog de test et de faire fonctionner RegLoadKey.
J'ai le même souci que toi, mais de façon aléatoire. Un e fois sur 2 ou 3, mes clefs sont mals chargées (ou partiellement).
Je ne vois pas d'ou cela vient, j'ai chercher un peu sur le net et plusieurs ont le meme probleme.

Une solution possible pour résoudre ton probleme serait de faire une sauvagarde sous ton propre format et de le recahrger ensuite.
Pour ca, tu enumeres tous les dossiers et sous dossiers à chaque fois que u en rencontres, pui toutes les valeurs contenues dans le dossier. Tu stocques dans ton fichier le type de la clef et sa valeur, et voila c'est fini.
Je teste demain une solution de ce genre et je te dis.
Sinon, l'autre solution, serait de reprendre et complété ma fonction pour créer des fichiers .reg.
Ptet que finalement c'est ce que je vais faire demain ;)
Vive le C
Savon
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
11 nov. 2006 à 18:45
Voila!

http://www.cppfrance.com/code.aspx?ID=28348

J'ai mis à jour ma source.
Elle permet maintenant de sauvegarder tous les types possibles dans la base de registre.
En fait, je mets tous les types possibles, mais j'en suis à peine sur. Je sauvegarde avec cette source tous les types que l'on peut créer directement avec regedit (REG_BINARY, REG_SZ, REG_DWORD, REG_EXPAND_SZ et REG_MULTI_SZ), mais il reste certains types d'apres MSDN que je ne gère pas.
C'est pour ca que j'ai mis aussi la sauvegarde à partir de la ligne de commande, comme ca tu es sur que tout sera sauvegardé.

Bonne fin de WE.
Vive le C
Savon
0
fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006
11 nov. 2006 à 22:03
Merci pour la source. Je regarderai lundi matin et je t'en donne des nouvelles.

Merci de ton aide
0
fannylapo Messages postés 9 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 16 novembre 2006
16 nov. 2006 à 20:42
bon ça laire que c'est trop long. Ta source à l'aire très bien mais j'ai de la difficulté à la faire marcher.
Je me suis fait dire de laisser faire ( ordre du supérieur )

tk merci beaucoup pour ton aide. Je suis pomal sur que ça l'aurais marché
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
16 nov. 2006 à 22:46
Trop long?

Pour sauvegarder une clef (et ses sous clef):
bdr_save_cmd("HKEY_LOCAL_MACHINE\\SOFTWARE\\MonAppli", "mon_fichier.reg");

Pour restaurer le fichier sauvegarder:
bdr_load""mon_fichier.reg");

Voila, rien de plus.
Le reste, c'est pour faire beau, et pour gérer la base de registre, creation, suppression, modification des clefs...
Dans ton cas, tu n'en as pas besoin.
Vive le C
Savon
0
Rejoignez-nous