Versuchs mal hiermit:
in der
Unit controls.pas folgende Methode ergänzen:
Delphi-Quellcode:
function GetControlAtom : Pointer;
function GetControlAtom : Pointer;
begin
Result := @ControlAtom;
end;
Jetzt brauchst Du noch 2 Methoden in der
DLL, eine um den Wert zu setzen und eine um den alten Wert wiederherzustellen:
Delphi-Quellcode:
locOldAtom: Integer = -1;
function Init(iRealControlAtom : Integer): Boolean;
stdcall;
var P: PWord;
begin
Result := False;
// TApplication ermittelt für das Verarbeiten einiger Messages die richtige Komponente
// über einen globalen "Atom". Der ist aber leider prozesspezifisch. D.h., dass er in
// einer Anwendung bestens funktioniert. Sobald aber (wie hier) eine DLL dazukommt
// wird innerhalb der DLL ein neuer eigener "Atom" initialisiert. Um trotzdem richtig
// arbeiten zu können teilen wir daher unserer DLL den "Atom" der Anwendung mit.
// Dazu haben wir uns in "controls.pas" gehackt und die Datei um eine neue Methode
// erweitert:
// function GetControlAtom : Pointer;
// begin
// Result := @ControlAtom;
// end;
P := GetControlAtom;
locOldAtom := P^;
P^ := iRealControlAtom;
Result := True;
end;
procedure Uninit;
var P: PWord;
begin
if locOldAtom<>-1
then
begin
P := GetControlAtom;
P^ := locOldAtom;
end;
end;
Was da eigentlich passiert (und warum) steht ja oben im Quelltext als Kommentar.