Passage de nil comme paramètre var

[Résolu]
Signaler
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Salut,

Prenons par exemple la fonction ImageRvaToVa.

Cette fonction est définie comme suit dans ImageHlp :

function ImageRvaToVa(NtHeaders: PImageNtHeaders; Base: Pointer;
  Rva: ULONG; var LastRvaSection: PImageSectionHeader): Pointer; stdcall;

Mais il est précisé dans la msdn que LastRvaSection est optionnel.

Mais comment diable puis je m'arranger pour que Delphi passe NULL ?

Sur un exemple plus simple, soit la fonction :

procedure Toto(var a: Cardinal); stdcall;
var
  nAddr: Cardinal;
begin
asm
  mov eax, dword ptr [ebp + 8];
  mov nAddr, eax
end;
  ShowMessage(IntToStr(nAddr));
end;

Elle affiche ce qu'on lui passe, l'adresse de a quoi, vu que en var c'est un pointeur qui est passé. Moi je voudrais qu'elle m'affiche 0, car pour moi a doit être NULL. J'ai pas de a en somme.

Toto(nil); compile pas...

var
  lpNil: Pointer;
begin
  lpNil:= nil;
  Toto(Cardinal(lpNil));

Fait passer l'adresse de lpNil...

Bref quelqu'un à une idée ?? Ca doit être tout bête mais je vois pas. Merci d'avance.

4 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
procedure Toto(var a: Cardinal); stdcall;

A ne peut etre mit a Nil puisqu'il est de type Cardinal et non Pointer

si tu fait :

var
  lpNil: Pointer;
begin
  lpNil:= nil;
  Toto(Cardinal(lpNil));

A renvois l'adresse de lpNil

par contre si tu fait :

type
  pCardinal = ^Cardinal;

procedure Toto(const A : pCardinal);

A pourra etre mis a nil :

toto(nil);

avec var A : ...

A doit etre une variable existante

procedure truc(var A : integer);
faisable : truc(X); truc(Y);
non faisable : truc(0); truc(nil); truc(pointerX^)

procedure bidule(const A: integer);
faisable : bidule(X); bidule(5); bidule(2+X); bidule(pointerX^)
non faisable : bidule(nil);

donc la fonction toto, pouvant accépter Nil sera a modifier comme suis :

type
  pCardinal = ^cardinal;

procedure Toto(const pA: pCardinal); stdcall;
pA ne peut etre alloué ou désalloué par la fonction, mais son contenus peut etre modifié

procedure Toto(var pA: pCardinal); stdcall;
pA peut etre alloué ou désalloué par la fonction et son contenus peut egalement etre modifié

procedure Toto(const pA: pCardinal); stdcall;
begin
   if pA <> nil then
     ShowMessage(Format('%.8x = %d',[cardinal(pA), pA^]))
   else
     ShowMessage('pA = null');
end;

procedure Toto(var pA: pCardinal); stdcall;
begin
  if pA = nil then
  begin
    New(pA);
    pA^ := 0;
  end;

   if pA <> nil then

     ShowMessage(Format('%.8x = %d',[cardinal(pA), pA^]))

   else

     ShowMessage('Erreur : pA = null malgré l''allocation forcée.');
end;

<hr size="2" width="100%" />

Merde ils ont foutu un costume noir à RT15 . Je me demande de quelle brigade il fait partie : Il doit être de la municipale .
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Circulez CSitoyen francky, y a rien a voir.

Merci f0xi.

Bon bin réécriture alors.

type PPImageSectionHeader = ^PImageSectionHeader;

function ImageRvaToVa(NtHeaders: PImageNtHeaders; Base: Pointer; Rva: ULONG; LastRvaSection: PPImageSectionHeader): Pointer; stdcall; external 'IMAGEHLP.DLL';

Heureusement que c'est relativement rare...
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
@Francky

« de la municipale... » ?
...
'sont pas armés, alors?
J'suis un peu déçu, là...