Comment trouver l'adresse du canvas d'un TIMAGE ?
Je développe des fonctions spécifiques dans une DLL, en Delphi 6 Personal Edition, sous XP, W7 et W8 toutes versions. Et je rencontre un problème particulier avec un TImage passé en paramètre à une de mes fonctions.
Je déclare ma fonction ainsi:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function GetCanvasAddress(pic: TObject):integer; stdcall; export;
begin
showmessage('a1 '+pic.ClassName); // <========== ici, j'ai bien TImage comme nom de classe !
case TImage(pic).Picture.Bitmap.PixelFormat of
pf1bit: showmessage('1 bits');
pf4bit: showmessage('4 bits');
pf8bit: showmessage('8 bits');
pf15bit: showmessage('15 bits');
pf16bit: showmessage('16 bits');
pf24bit: showmessage('24 bits');
pf32bit: showmessage('32 bits');
pfCustom: showmessage('pfCustom');
pfDevice: showmessage('pfDevice'); // <======== c'est ce format qui semble être reconnu, alors que ça devrait être 24 ou 32 bits !
else
showmessage('? bits');
end;
...
end; |
Déjà, le pixelformat n'est pas reconnu correctement. Et je ne peux pas faire:
Code:
1 2 3 4
|
...
line := TImage(pic).Picture.Bitmap.Scanline[0]; // <=========== crash ici !
... |
Je peux affirmer que la fonction de la DLL s'exécute dans le thread principal du programme appelant.
Question: quel est la structure, le "layout" de l'objet TImage qui est passé à ma fonction ? J'ai "dumpé" les 64 premier integer 32 bits à partir de l'adresse que représente "pic", mais je ne sais pas interpréter le contenu. J'ai seulement réussi à identifier, avec certitude, les deux offsets suivants:
mot 18 (offset 72) = largeur du TImage, en pixels
mot 19 (offset 76) = hauteur du TImage, en pixels
J'aimerais savoir comment trouver un pointeur, l'adresse du canvas associé au TImage, afin d'interagir avec le canvas, sans avoir à passer par les méthodes Pixels ou Scanline, qui ne fonctionnent pas dans mon contexte. Je sais comment est structuré un canvas, en fonction du pixelformat. J'ai juste besoin de savoir comment trouver l'adresse de début du canvas, à partir de la valeur qui représente l'objet TImage et qui est en réalité un pointeur vers une structure décrivant le TImage.