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

cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 4 mars 2009 à 13:08 - Dernière réponse : Caribensila 2674 Messages postés jeudi 15 janvier 2004Date d'inscription 11 mai 2018 Dernière intervention
- 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

f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 4 mars 2009 à 14:04
+3
Utile
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%" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
Utilisateur anonyme - 4 mars 2009 à 13:58
0
Utile
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
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 4 mars 2009 à 14:29
0
Utile
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
Caribensila 2674 Messages postés jeudi 15 janvier 2004Date d'inscription 11 mai 2018 Dernière intervention - 4 mars 2009 à 17:28
0
Utile
@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.