Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#52

Re: Zugriff auf ein TImage einer externen Anwendung

  Alt 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.
  Mit Zitat antworten Zitat