Mes premiers essais me laissent perplexe.
D'abord, mon compilateur D6 Personal Edition ne laisse pas passer la construction
NativeInt(PObj) := GetWindowLong(Application.Handle, GWL_WNDPROC);
J'ai donc transformé ton code comme suit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| type
PObjectInstance = ^TObjectInstance;
TObjectInstance = packed record
Code : Byte;
Offset: Integer;
Proc : Pointer; // TApplication.WndProc
App : TApplication;
end;
procedure GetApplication(happ: THandle);
var
PObj: PObjectInstance;
begin
PObj := PObjectInstance(GetWindowLong(happ, GWL_WNDPROC));
if PObj.App = Application then ShowMessage('YES !')
else Showmessage('NO !');
if PObj.App.InstanceSize <> Application.InstanceSize then
ShowMessage('Warning ! versions de Delphi incompatibles - '+inttostr(PObj.App.InstanceSize)+'<>'+inttostr(Application.InstanceSize))
else
ShowMessage('Warning ! versions de Delphi compatibles - '+inttostr(PObj.App.InstanceSize)+'<>'+inttostr(Application.InstanceSize));
end; |
Ai-je bien compris le principe ?
Test 1: j'ai placé ce code dans le projet Progrramme (programme principal) et j'ai appelé la procédure GetApplication dans Form1.Create de la manière suivante:
GetApplication(Application.Handle);
Résultat: un message "YES !", suivi de "compatible" avec les deux tailles identiques de 296 octets.
Test 2: j'ai placé ce code dans le projet test_Hint (la DLL) et j'ai appelé la procédure GetApplication dans ma fonction ConfigureHintProperties comme suit:
Résultat: un message "NO !", suivi de "compatible" avec les deux tailles identiques de 296 octets.
Test 3: j'ai appelé ma fonction ConfigureHintProperties dans cette DLL par mon programme externe réel, écrit en Basic.
Résultat: un message "NO !", suivi de "incompatible" avec les deux tailles différentes de 360 et 296 octets.
Alors, j'ai besoin d'y voir plus clair.
1. comment GetWindowLong avec l'offset WNDPROC (soit la valeur -4) peut-elle retourner un pointeur vers l'instance de l'objet Application ?
2. pourquoi, dans Test 2, j'ai une réponse "NO !" alors que les deux projets (test_Hint.dpr pour la DLL et programme.dbr pour le programme appelant) ont été compilés et générés par le même cimpilateur Delphi ?
3. une question peut-être un peu plus générale: y a-t-il un lien entre le handle d'un objet (forcément un TWinControl, je ne parle pas des Canvas) et l'instance de cet objet ?
4. est-ce que la réponse à (3) s'applique également à un objet TApplication ?
Dans mon esprit, l'objet Application a un lien avec la fenêtre initiale (de dimensions 0x0 pixels) créée par Delphi au démarrage. Cet objet crée également la ou les forms de l'application et détermine la MainForm, entre autres. Je sais bien que TApplication n'est par un TForm, mais TApplication a un handle, et le fait que tu utilises GetWindowLong(Application.Handle, GWL_WNDPROC) semble impliquer que la structure des deux types d'objet est très proche. Est-ce que je me trompe ?
Partager