Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
Delphi 7 Enterprise
|
Re: Zugriff auf ein TImage einer externen Anwendung
27. Feb 2007, 15:45
So, jetzt kommt noch etwas Komfort in die Sache (hoffe ich). Ich hab die Exceptionbehnadlung hinbekommen. Dadurch schmiert der fremde Prozess nicht ab, wenn ein Fehler in der Info auftritt (bei mir klappt es zumindest ).
Die Änderungen mal wieder im Text:
Delphi-Quellcode:
procedure info(...); stdcall;
//bisherige Variablen beibehalten
//neu hinzukommen:
var isexception:longbool;
myexception:cardinal;
begin
asm //ging leider nur in Assembler
xor edx,edx
mov myexception,edx
mov isexception,edx
push ebp
call @@1
@@1:
add [esp],15
push dword ptr fs:[edx]
mov dword ptr fs:[edx],esp
mov myexception,esp
jmp @@ try
@@ except:
mov eax,esp //hier springt er hin, wenn eine Exception auftaucht
add eax,4
mov esp,myexception
mov ebp,[esp+8]
inc isexception
xor edx,edx
pop dword ptr fs:[edx]
pop edx
pop ebp
mov eax,[eax]
mov edx,dword ptr [eax]
mov wparam,edx //ExcpetionCode
mov edx,[eax+12]
mov lparam,edx //Adresse, wo passiert
@@ try:
end;
if not isexception then begin
//hier kommt alles was sonst zwischen try..except stehen würde
//also der bisherige Inhalt der Info
Searchtype:=TSearchType(lparam mod 65536);
.
.
.
memory^.Postmessage(memory^.backwnd,backmsg,wparam,lparam);
//hier noch anfügen (um die exception Behandlung wieder zu entfernen, wenn alles klar gelaufen ist)
asm
xor edx,edx
pop dword ptr fs:[edx]
pop edx
pop edx
end;
end else begin
//Wenn oben irgendetwas schief läuft (z.B. EAccessViolation) dann springt er zurück in den Assemblercode ganz oben
//und dort wird isexception auf true gesetzt, damit er nacher hier landet
//und hier können wir jetzt exceptionbehandlung betreiben
//in dem fall einfach ne Message schicken, dass ein fehler passiert ist
memory^.Postmessage(memory^.backwnd,errormsg,wparam,lparam);
//ErrorMsg muss noch als Konstante definiert werden
end;
end;
ErrorMsg im Hauptprigramm bearbeiten:
Delphi-Quellcode:
const ErrorMsg=ImageMsg+6; //oder so ähnlich
...
type Tform1....
...
procedure GetErrorMsg(var msg:TMessage);message ErrorMsg;
...
end;
...
procedure Tform1.getErrorMsg(var msg:TMessage);
begin
if cardinal(msg.wparam)=EXCEPTION_ACCESS_VIOLATION then
memo1.lines.add('Error: EAccessViolation @'+inttohex(msg.lparam,8))
else
memo1.lines.add('Error: '+inttohex(msg.wparam,8)+' @'+inttohex(msg.lparam,8));
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
|
|
Zitat
|