begin process at 2008 07 06 01:19:46
1 205 425 membres
7 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GESTION BASE DE REGISTRE (LOCAL OU DISTANTE)AVEC DES FONCTIONS API(NEW)


Information sur la source

Catégorie :API Classé sous : registre, api Niveau : Initié Date de création : 02/06/2006 Date de mise à jour : 03/06/2006 20:36:58 Vu : 4 838

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

Avec toutes mes excuses de la version précédente, il s'agit d'une première
ébauche qui part inadvertance, j'ai mis à disposition.
Voici la bonne version:
Elle permet dans une base de registre distante ou local(valeur NULL):
-Lecture de clé et valeur.
-Création d'une clé et valeur.
-Suppression d'une clé ou valeur.
Ce code contient un petit programme pour tester les fonctions.
Rem:Compilation avec Borland C++ 5.5 (pas d'erreur de compil).

Source

  • //----------------------------------------------------------------------------
  • // Designation : Gestion base de registre
  • // Auteur : UKR6900
  • // Date : 01/06/2006
  • // Date dernier MAJ : 03/06/2006
  • // D'après le Prg de :
  • //----------------------------------------------------------------------------
  • #include <stdio>
  • #include <stdlib>
  • #include <windows>
  • #include <ostream>
  • const int cstMaxRegLength = 1024;
  • //------------------------------------------------------------------------------
  • // FONCTION : QuesryKey
  • // DESCRIPTION : Permet de lire la valeur d'une clé de regsitre
  • //-------------------------------------------------------------------------------
  • string GetValueData(HKEY hkTopKey, string lpSubKey, string lpValueName){
  • HKEY hkKey;
  • DWORD lpType, dwDataSize = cstMaxRegLength;
  • //Receptionne la valeur de réception lecture clé registre
  • unsigned char * lpData = new unsigned char[cstMaxRegLength];
  • //Receptionne la valeur de réception lecture clé registre
  • char * rValue = new char[cstMaxRegLength];
  • rValue[0] = '\0';
  • //Lecture de la clé registre si ok passe à la suite...
  • if (RegOpenKeyEx(hkTopKey,lpSubKey.c_str(),0,KEY_READ,&hkKey) == ERROR_SUCCESS){
  • if (RegQueryValueEx(hkKey,lpValueName.c_str(),NULL,&lpType,lpData,&dwDataSize) == ERROR_SUCCESS){
  • //déchiffrage des différents type de clé dans registry
  • switch ((int)lpType){
  • case REG_BINARY:
  • itoa((u_int)(lpData[0]),rValue, 10);
  • strcat(rValue,".");
  • itoa((u_int)(lpData[1]),(char*)(rValue+strlen(rValue)),10);
  • strcat(rValue,".");
  • itoa((u_int)(lpData[2]),(char*)(rValue+strlen(rValue)),10);
  • strcat(rValue,".");
  • itoa((u_int)(lpData[3]),(char*)(rValue+strlen(rValue)),10);
  • break;
  • case REG_DWORD:
  • itoa(*(int*)(lpData),rValue,10);
  • break;
  • case REG_EXPAND_SZ:
  • rValue=(char *)lpData;
  • break;
  • case REG_MULTI_SZ:
  • rValue=(char *)lpData;
  • break;
  • case REG_SZ:
  • rValue=(char *)lpData;
  • break;
  • }//end switch
  • }//end if
  • RegCloseKey(hkKey);
  • }//end if
  • return rValue;
  • }//end function
  • //------------------------------------------------------------------------------
  • // FONCTION : CreateKey
  • // DESCRIPTION : Permet de creer une cle, une valeur et de modifier une valeur
  • //-------------------------------------------------------------------------------
  • long CreateKey(HKEY hkTopKey,const char *lpSubKey,const char *lpClass,const char *lpData){
  • HKEY keyHandle;
  • DWORD lpdw;
  • //Afin de placer la valeur vous devez indiquer la longueur du lpData.
  • int aLen = strlen(lpData) + 1;
  • //Ceci créera la clef si elle n'existe pas ou ne la met pas à jour s'il elle existe.
  • if ( RegCreateKeyEx(hkTopKey,lpSubKey,0,"Anything",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&keyHandle,&lpdw)== ERROR_SUCCESS){
  • //Ceci écrira les données à la clef nouvellement créée ou les mettra à jour.
  • long rtn=RegSetValueEx(keyHandle,lpClass,0,REG_SZ,(LPBYTE)lpData,aLen);
  • //il faut fermer la cle de registre
  • RegCloseKey(keyHandle);
  • return rtn;
  • }//end if
  • //ferme le canal de communication (handle)
  • RegCloseKey(hkTopKey);
  • return 1;
  • }//end function
  • //---------------------------------------------------------------------------------
  • // FONCTION : DeleteKey
  • // DESCRIPTION : Permet de supprimer une cle et les valeurs contenues dans la cle
  • //----------------------------------------------------------------------------------
  • long DeleteKey(HKEY hkTopKey,char *clpPathKey){
  • HKEY hkKey;
  • //Verifie si la cle specifiee existe
  • if (RegOpenKeyEx(hkTopKey,clpPathKey,0,KEY_READ|KEY_WRITE,&hkKey) == ERROR_SUCCESS){
  • //Efface la cle
  • long rtn=RegDeleteKey(hkTopKey,clpPathKey);
  • RegCloseKey(hkTopKey);
  • return rtn;
  • }//end if
  • //ferme le canal de communication (handle)
  • RegCloseKey(hkTopKey);
  • return 1;
  • }//end function
  • //------------------------------------------------------------------------------
  • // START PROGRAM
  • //-------------------------------------------------------------------------------
  • int main(){
  • string NomPc; //Si le pc est locale
  • string Valeur; //Récupére la valeur de la clé
  • // string NomPc = "\\\\PC050001494"; //Si le pc est distant
  • int error = 0;
  • HKEY hkKey;
  • //-------------------------------------------------------------
  • //Connection à distance sur le pc Remote ou locale
  • if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){
  • printf("Ordinateur %s non trouvé\n", NomPc);
  • error = 2;
  • }else {
  • Valeur = GetValueData(hkKey,"SOFTWARE\\Microsoft\\Internet Connection Wizard","InstallationDirectory");
  • cout << Valeur << endl;
  • }//end if
  • //-------------------------------------------------------------
  • //cree une cle et une valeur dans la base de registre
  • if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){
  • printf("Ordinateur %s non trouvé\n", NomPc);
  • error = 2;
  • }else {
  • if(CreateKey(hkKey,"Software\\Folder1","MyKey","MyValue")== ERROR_SUCCESS)
  • cout << "création réussie" << endl;
  • else
  • cout << "Problème de création!" << endl;
  • //end if
  • }//end if
  • //-------------------------------------------------------------
  • //cree une cle et une valeur dans la base de registre
  • if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){
  • printf("Ordinateur %s non trouvé\n", NomPc);
  • error = 2;
  • }else {
  • if(DeleteKey(hkKey,"Software\\Folder1")== ERROR_SUCCESS)
  • cout << "Effacement réussie" << endl;
  • else
  • cout << "Problème de la suppression!" << endl;
  • //end if
  • }//end if
  • //-------------------------------------------------------------
  • return error;
  • }//end programme
  • //------------------------------------------------------------------------------
  • // END PROGRAM
  • //-------------------------------------------------------------------------------
//---------------------------------------------------------------------------- 
// Designation : Gestion base de registre 
// Auteur : UKR6900 
// Date : 01/06/2006 
// Date dernier MAJ : 03/06/2006 
// D'après le Prg de : 
//---------------------------------------------------------------------------- 
  
#include <stdio> 
#include <stdlib> 
#include <windows> 
#include <ostream> 
  
  
  const int cstMaxRegLength = 1024; 
  
//------------------------------------------------------------------------------ 
// FONCTION : QuesryKey 
// DESCRIPTION : Permet de lire la valeur d'une clé de regsitre 
//------------------------------------------------------------------------------- 
  string GetValueData(HKEY hkTopKey, string lpSubKey, string lpValueName){ 
    HKEY hkKey; 
    DWORD lpType, dwDataSize = cstMaxRegLength; 
  
  //Receptionne la valeur de réception lecture clé registre 
    unsigned char * lpData = new unsigned char[cstMaxRegLength]; 
    
  //Receptionne la valeur de réception lecture clé registre 
    char * rValue = new char[cstMaxRegLength]; 
    rValue[0] = '\0';
  //Lecture de la clé registre si ok passe à la suite... 
    if (RegOpenKeyEx(hkTopKey,lpSubKey.c_str(),0,KEY_READ,&hkKey) == ERROR_SUCCESS){ 
  
      if (RegQueryValueEx(hkKey,lpValueName.c_str(),NULL,&lpType,lpData,&dwDataSize) == ERROR_SUCCESS){ 
      //déchiffrage des différents type de clé dans registry 
        switch ((int)lpType){ 
  
          case REG_BINARY: 
               itoa((u_int)(lpData[0]),rValue, 10); 
               strcat(rValue,"."); 
               itoa((u_int)(lpData[1]),(char*)(rValue+strlen(rValue)),10); 
               strcat(rValue,"."); 
               itoa((u_int)(lpData[2]),(char*)(rValue+strlen(rValue)),10); 
               strcat(rValue,"."); 
               itoa((u_int)(lpData[3]),(char*)(rValue+strlen(rValue)),10); 
               break; 
  
          case REG_DWORD: 
               itoa(*(int*)(lpData),rValue,10); 
               break; 
  
          case REG_EXPAND_SZ: 
               rValue=(char *)lpData; 
               break; 
  
          case REG_MULTI_SZ: 
               rValue=(char *)lpData; 
               break; 
  
          case REG_SZ: 
               rValue=(char *)lpData; 
               break; 
        }//end switch 
      }//end if 
      RegCloseKey(hkKey); 
    }//end if 
    return rValue; 
  }//end function 
  
//------------------------------------------------------------------------------ 
// FONCTION : CreateKey 
// DESCRIPTION : Permet de creer une cle, une valeur et de modifier une valeur 
//------------------------------------------------------------------------------- 
  long CreateKey(HKEY hkTopKey,const char *lpSubKey,const char *lpClass,const char *lpData){ 
    HKEY keyHandle; 
    DWORD lpdw; 
  //Afin de placer la valeur vous devez indiquer la longueur du lpData. 
    int aLen = strlen(lpData) + 1; 
  
  //Ceci créera la clef si elle n'existe pas ou ne la met pas à jour s'il elle existe. 
    if ( RegCreateKeyEx(hkTopKey,lpSubKey,0,"Anything",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&keyHandle,&lpdw)== ERROR_SUCCESS){ 
    //Ceci écrira les données à la clef nouvellement créée ou les mettra à jour. 
      long rtn=RegSetValueEx(keyHandle,lpClass,0,REG_SZ,(LPBYTE)lpData,aLen); 
    //il faut fermer la cle de registre 
      RegCloseKey(keyHandle); 
      return rtn; 
     }//end if 
  
  //ferme le canal de communication (handle) 
    RegCloseKey(hkTopKey); 
     
    return 1; 
  }//end function 
  
//--------------------------------------------------------------------------------- 
// FONCTION : DeleteKey 
// DESCRIPTION : Permet de supprimer une cle et les valeurs contenues dans la cle 
//---------------------------------------------------------------------------------- 
  long DeleteKey(HKEY hkTopKey,char *clpPathKey){ 
    HKEY hkKey; 
  //Verifie si la cle specifiee existe 
    if (RegOpenKeyEx(hkTopKey,clpPathKey,0,KEY_READ|KEY_WRITE,&hkKey) == ERROR_SUCCESS){ 
    //Efface la cle 
      long rtn=RegDeleteKey(hkTopKey,clpPathKey); 
      RegCloseKey(hkTopKey); 
      return rtn; 
     }//end if 
  
  //ferme le canal de communication (handle) 
    RegCloseKey(hkTopKey); 
    return 1; 
  }//end function 
  
//------------------------------------------------------------------------------ 
// START PROGRAM 
//------------------------------------------------------------------------------- 
  int main(){ 
    string NomPc; //Si le pc est locale 
    string Valeur; //Récupére la valeur de la clé
   // string NomPc = "\\\\PC050001494"; //Si le pc est distant 
    int error = 0; 
    HKEY hkKey; 
  
//------------------------------------------------------------- 
  //Connection à distance sur le pc Remote ou locale 
    if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){ 
       printf("Ordinateur %s non trouvé\n", NomPc); 
       error = 2; 
    }else { 
       Valeur = GetValueData(hkKey,"SOFTWARE\\Microsoft\\Internet Connection Wizard","InstallationDirectory");

       cout << Valeur << endl; 
    }//end if 
//------------------------------------------------------------- 
 //cree une cle et une valeur dans la base de registre 
   if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){ 
       printf("Ordinateur %s non trouvé\n", NomPc); 
       error = 2; 
    }else { 
       if(CreateKey(hkKey,"Software\\Folder1","MyKey","MyValue")== ERROR_SUCCESS) 
         cout << "création réussie" << endl; 
        else 
          cout << "Problème de création!" << endl; 
       //end if 
   }//end if 
//------------------------------------------------------------- 
 //cree une cle et une valeur dans la base de registre 
   if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){ 
       printf("Ordinateur %s non trouvé\n", NomPc); 
       error = 2; 
    }else { 
       if(DeleteKey(hkKey,"Software\\Folder1")== ERROR_SUCCESS) 
         cout << "Effacement réussie" << endl; 
        else 
          cout << "Problème de la suppression!" << endl; 
       //end if 
   }//end if 
//------------------------------------------------------------- 
    return error; 
  }//end programme 
  
//------------------------------------------------------------------------------ 
// END PROGRAM 
//------------------------------------------------------------------------------- 
  
02 juin 2006 08:47:11 :
prob texte
02 juin 2006 20:15:20 :
Modif faites suivant les remarques données par excrt saut pour la libération de la mémoire sur delete [] lpData ou je n'ai plus aucune valeur de retour ??? merci pour les remarques.
03 juin 2006 20:36:58 :
Changement de certaim pointeur char* en string tests sur la fonction GetValueData avec différentes recherches ok
  • signaler à un administrateur
    Commentaire de vecchio56 le 02/06/2006 11:16:50 administrateur CS

    Je pensais pas qu'on pouvait déposer des ébauches par inadvertance

  • signaler à un administrateur
    Commentaire de vecchio56 le 02/06/2006 11:22:20 administrateur CS

    Tu es sur qu'il ne manque rien? Parce que la j'ai pas compris l'intérêt de ton code

  • signaler à un administrateur
    Commentaire de UKR6900 le 02/06/2006 12:13:33

    Dans un code source ,il manque toujour quelque chose
    c'est ça enrichir un code au fur et mesure des besoins.
    Mais celui-ci est une base importante pour une programmation
    système des base de registre.(Contrôle des paramétrages Anti-virus, création des
    clé pour contrôle des logs etc...)
    Ce sont les fonctions qui sont importantes,pas le code qui donne un exemple d'utilisation des fonctions.
    Et celui qui comprend pas l'intérêt de ce code, c'est qu'il ne travaille pas dans le bon domaine de programmation et voilà....
    Moi dans le temps, j'aurai été content de trouver des exemples comme celui-ci.
    A bon entendeur, A+

  • signaler à un administrateur
    Commentaire de excrt le 02/06/2006 16:57:02

    « Rem:Compilation avec Borland C++ 5.5 (pas d'erreur de compil).  »

    une compilation sans erreur ne veut strictement _rien_ dire ...
    tu peux très bien avoir « 0 error(s), 0 warning(s) » lors de la compilation
    et obtenir un soft _complètement_ disfonctionnel!

  • signaler à un administrateur
    Commentaire de excrt le 02/06/2006 17:03:43

    en passant:
    « cout << GetValueData(hkKey,"SOFTWARE\\Microsoft\\DirectX","Version") << endl; »

    ton GetValueData() retourne un pointeur sur un char* que tu as alloué
    récupère la valeur de GetValueData() et _ensuite_, affiche la

    char* ptr = GetValueData( ... );
    cout << ptr << endl;
    delete [] ptr;

    sinon tu vas avoir des fuites de mémoire _partout_ !

    dans ton GetValueData(), petit truc:

    // ...
    char * rValue = new char[cstMaxRegLength];
    rValue[0] = '\0'; // place ca ici(valeur par défaut, si on veut), comme ca tu sauve beaucoup de « else/default/... »
    // ..

    la répétition de code c'est pas très bon ...

  • signaler à un administrateur
    Commentaire de excrt le 02/06/2006 17:06:25

    dernière petite chose pour aujourd'hui
    dans « GetValueData() » tu as oublié de libérer la mémoire alloué pour lpData

    « delete [] lpData; » avant de quitter la fonction(GetValueData)

  • signaler à un administrateur
    Commentaire de excrt le 04/06/2006 16:50:56

    #include <windows.h> // ...
    #include <iostream> // std::cout
    #include <string> // std::string
    #include <sstream> // std::stringstream

    // PCSTR >> const char*
    std::string GetValueData(HKEY hkTopKey, PCSTR pSubKey, PCSTR pValueName)
    {
        HKEY hkKey;
        DWORD dwType;
        DWORD dwDataSize = cstMaxRegLength;
        BYTE* pData;
        std::string strBuffer;
        std::stringstream strStream;

        if (RegOpenKeyExA(hkTopKey, pSubKey, 0, KEY_READ, &hkKey) == ERROR_SUCCESS)
        {
            pData = new BYTE[cstMaxRegLength + 1];

            if (RegQueryValueExA(hkKey, pValueName, NULL, &dwType, pData, &dwDataSize) == ERROR_SUCCESS)
            {
                switch (dwType)
                {
                    case REG_BINARY:
                        strStream << (UINT)pData[0] << (CHAR)'.' <<\
                                     (UINT)pData[1] << (CHAR)'.' <<\
                                     (UINT)pData[2] << (CHAR)'.' <<\
                                     (UINT)pData[3];
                        break;

                    case REG_DWORD:
                        strStream << *(DWORD*)pData;
                        break;

                    default: dwDataSize = 0;
                        // !break

                    case REG_EXPAND_SZ:
                    case REG_MULTI_SZ:
                    case REG_SZ:
                        pData[dwDataSize] = '\0'; // simple précaution
                        strStream << (PCSTR)pData;
                        break;
                }
                strBuffer = strStream.str();
            }
            delete [] pData; // libère la mémoire
            RegCloseKey(hkKey);
        }
        return strBuffer;
    }

    int main()
    {
        std::string retval = GetValueData(..., ..., ...);

        std::cout << retval << std::endl;
        return 0;
    }

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS