Paramètres par adresse et non par valeur

Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004 - 16 sept. 2002 à 21:03
Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004 - 19 sept. 2002 à 12:54
J'utilise qq fonctions et procédures qui ont pour but de de générer un numéro CLSID.

Le prob est que je n'arrive pas à passer mes paramêtres par adresse mais par valeur. Du coup toute modification est oubliée.

j'appelle la function Creation_CLSID en premier ( voir plus loin ). La façon de procédé n'est pas tellement belle mais ce n'est pas important du moment que ça marche. Merci d'avance.
Voila les fonctions ( comment dois-je faire ? )

function Ajout_One_Hex(Car:char):Char;
begin
Ajout_One_Hex := '0';
case Car of
'0','1','2','3','4','5','6','7','8':Ajout_One_Hex := Chr(Ord(Car)+1);
'9':Ajout_One_Hex := 'A';
'A':Ajout_One_Hex := 'B';
'B':Ajout_One_Hex := 'C';
'C':Ajout_One_Hex := 'D';
'D':Ajout_One_Hex := 'E';
'E':Ajout_One_Hex := 'F';
'F':Ajout_One_Hex := '0';
end;
end;

function One(Buffer: array of char; Len:Integer):Byte;
begin
One := 1;
if (Len > -1) then
begin
if Buffer[Len] = 'F' then
begin
Buffer[Len] := '0';
One := One(Buffer, Len - 1);
end
else
begin
Buffer[Len] := Ajout_One_Hex(Buffer[Len]);
One := 0;
end;
end;
end;

procedure Add_One(Buf1:array of char; Buf2:array of char; Buf3:array of char; Buf4:array of char; Buf5:array of char);
begin
if One(Buf5, 11) = 1 then
begin
if One(Buf4, 3) = 1 then
begin
if One(Buf3, 3) = 1 then
begin
if One(Buf2, 3) = 1 then
begin
if One(Buf1, 7) = 1 then
ShowMessage('Création impossible');
end
end
end
end
end;

//Compose un CLSID
function Creation_CLSID():string;
var
Buffer1: array [0..8] of char;
Buffer2: array [0..4] of char;
Buffer3: array [0..4] of char;
Buffer4: array [0..4] of char;
Buffer5: array [0..12] of char;
Reg:TRegistry;
CLSID:string;
begin
//{00030008-0000-0000-C000-000000000046}
Buffer1 := '00000000';
Buffer2 := '0000';
Buffer3 := '0000';
Buffer4 := '0000';
Buffer5 := '000000000002';

Add_One(Buffer1, Buffer2, Buffer3, Buffer4, Buffer5);
CLSID := '{' + Buffer1 + '-' + Buffer2 + '-' + Buffer3 + '-' + Buffer4 + '-' + Buffer5 + '}';

ShowMessage(CLSID);
end;
;) Bruto --- Le p'tit belge --- pour vous servir

3 réponses

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
17 sept. 2002 à 22:47
Ce n'est pourtant pas compliqué de passer des paramètres par adresse : il suffit d'ajouter VAR devant la déclaration :
function One(VAR Buffer: array of char; Len:Integer):Byte;
...
procedure Add_One(VAR Buf1,Buf2,Buf3,Buf4,Buf5:array of char);

De plus dans Creation_CLSID, il faut donner une valeur de retour :
...
Result := '{' + Buffer1 + '-' + Buffer2 + '-' + Buffer3 + '-' + Buffer4 + '-' + Buffer5 + '}';
ShowMessage(Result);
...

--- :sleepy) Nono du Moulin :sleepy) ---
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 sept. 2002 à 13:14
Pour créer des CLSID, delphi fournit des fonctions :

Var
GUID : TGuid;
S : string;
begin
CoCreateGuid(GUID);
S:= GuidToString(GUID);
end;

Exemple tiré de l'excellent livre d'Eric HARMON : Delphi COM programming.

Pourquoi réinventer la roue ?

May Delphi be with you.
Delphi advanced
0
Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004
19 sept. 2002 à 12:54
Merci DelphiProg, renseignement intéressant mais ma procedure marche tout en évitant de supprimer ou d'écraser un CLSID existant.
Le prog est enfin opérationnel voir : Associer un icône à un dossier.

Bonne prog.

;) Bruto --- Le p'tit belge --- pour vous servir
0
Rejoignez-nous