Accès à la base de registre avec builder c++

Soyez le premier à donner votre avis sur cette source.

Vue 6 948 fois - Téléchargée 480 fois

Description

Ce code présente un exemple d'accès à la base de registre Windows, notamment il explique comment modifier l'adresse de la carte réseau, fonctionnant seulement sous Windows 95/98/Me

Source / Exemple :


//------------------------IPPrj.CPP------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}
//---------------------IPPrj.cpp-------------------------------------------

//---------------------Unit1.h---------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        TButton *Button2;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TEdit *Edit4;
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//-------------------------Unit1.h-------------------------------------------

//-------------------------Unit1.cpp-----------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "registry.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//------------ Procédure pricipales------------

// Procédure récupérant l'adresse IP à partir du registre Windows
char * GetIPAdr(){
TRegistry *reg1=new TRegistry();
AnsiString SS;
reg1->RootKey=HKEY_LOCAL_MACHINE;
  // recherche du code de la carte réseau
reg1->OpenKeyReadOnly("System\\CurrentControlSet\\Services\\Class\\Nettrans\\0000");
SS=reg1->ReadString("IPAddress");
reg1->CloseKey();
delete reg1;
return SS.c_str();
}

// Procédure mettant à jour l'adresse IP dans le registre (redémarrage nécessaire)
char * SetIPAdr(char *str){
TRegistry *reg1=new TRegistry();

reg1->RootKey=HKEY_LOCAL_MACHINE;
  // recherche du code de la carte réseau
reg1->Access=KEY_WRITE;
reg1->OpenKey("System\\CurrentControlSet\\Services\\Class\\Nettrans\\0000",false);
reg1->WriteString("IPAddress",str);
reg1->CloseKey();
delete reg1;

}

// Procédure de copir d'une partie d'une chaîne
void strcpyfromto(char *source,char *dest,int begin,int end)
{
 int i;

 if (begin!=end)
    {
     for (i=0; ((dest[i]=source[i+begin]) != '\0'&&i<end-begin-1);i++);
     dest[i+1]='\0';
    }
 else dest[0]='\0';
}

// Cette procédure formatte et affiche à l'écran l'adresse
void WriteIPAdr(char *S){
char *S1,*S2,*S3,*S4;
S1=(char *)malloc(4);
S2=(char *)malloc(4);
S3=(char *)malloc(4);
S4=(char *)malloc(4);

int j=1;
int old_i=0;
for(int i=0;i<strlen(S);i++){
 if (S[i]=='.'){
   switch (j) {
   case 1:{strcpyfromto(S,S1,old_i,i);
           old_i=i+1;
           j++;
           break;
           }
   case 2: {strcpyfromto(S,S2,old_i,i);
           old_i=i+1;
           j++;
           break;
           }
   case 3: {strcpyfromto(S,S3,old_i,i);
           old_i=i+1;
           j++;
           break;
           }
   }
   }

}
strcpyfromto(S,S4,old_i,strlen(S));

Form1->Edit1->SetTextBuf(S1);
Form1->Edit2->SetTextBuf(S2);
Form1->Edit3->SetTextBuf(S3);
Form1->Edit4->SetTextBuf(S4);

free(S1);
free(S2);
free(S3);
free(S4);

}

// Cette procédure teste la validité de l'adresse entrée manuellement 
bool CorrectIPSeg(char *Segment,int nseg){
int a=atoi(Segment);
if ((nseg==4 || nseg==1) && a<255 && a>0) return true;
if ((nseg==3 || nseg==2) && a<255 && a>-1) return true;
return false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
//  Annuler les modifications
char *S=(char *) malloc(255);
S=GetIPAdr();
WriteIPAdr(S);
free(S);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Appliquer les modifications
char *S1,*S2,*S3,*S4,*ADRIP;
S1=(char *)malloc(4);
S2=(char *)malloc(4);
S3=(char *)malloc(4);
S4=(char *)malloc(4);
ADRIP=(char *)malloc(255);
Edit1->GetTextBuf(S1,4);
Edit2->GetTextBuf(S2,4);
Edit3->GetTextBuf(S3,4);
Edit4->GetTextBuf(S4,4);
if (!(CorrectIPSeg(S1,1) && CorrectIPSeg(S2,2)
        && CorrectIPSeg(S3,3) && CorrectIPSeg(S4,4))){
        Application->MessageBox("Adresse IP invalide !","Erreur",MB_OK);

        return;
        }

strcpy(ADRIP,S1);
strcat(ADRIP,".");
strcat(ADRIP,S2);
strcat(ADRIP,".");
strcat(ADRIP,S3);
strcat(ADRIP,".");
strcat(ADRIP,S4);

SetIPAdr(ADRIP);

free(S1);
free(S2);
free(S3);
free(S4);
free(ADRIP);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Lecture de l'adresse au lancement de l'application
char *S=(char *) malloc(255);
S=GetIPAdr(); //Lire l'adresse du registre
WriteIPAdr(S); // afficher l'adresse
free(S); // on peut toujours utiliser malloc & free (ancienne école)
}

//--------------------------Unit1.cpp----------------------------------------

Codes Sources

A voir également

Ajouter un commentaire Commentaire
Messages postés
230
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
15 mai 2008

Muais, utile mais en même temps l'aide de BCB explique de façon claire (et c'est pas toujours le cas) comment faire...
Bravo pour l'encapsulation du bidule, mais t'apporte rien de vraiment nouveau et intéressant...

Un autre truc :
S1=(char *)malloc(4);
C'est du C ça... fait plutôt :
S1 = new char[4];

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.