Passage de nil comme paramètre var [Résolu]

Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- - Dernière réponse : Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci
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%" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 104 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
0
Merci
Merde ils ont foutu un costume noir à RT15 . Je me demande de quelle brigade il fait partie : Il doit être de la municipale .
Commenter la réponse de Utilisateur anonyme
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
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...
Commenter la réponse de cs_rt15
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
@Francky

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

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.