Passage de nil comme paramètre var

Résolu
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 4 mars 2009 à 13:08
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 4 mars 2009 à 17:28
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

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 mars 2009 à 14:04
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%" />
3
Utilisateur anonyme
4 mars 2009 à 13:58
Merde ils ont foutu un costume noir à RT15 . Je me demande de quelle brigade il fait partie : Il doit être de la municipale .
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
4 mars 2009 à 14:29
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...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 mars 2009 à 17:28
@Francky

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