Delphi-PRAXiS
Seite 6 von 12   « Erste     456 78     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zugriff auf ein TImage einer externen Anwendung (https://www.delphipraxis.net/86561-zugriff-auf-ein-timage-einer-externen-anwendung.html)

sirius 26. Feb 2007 18:10

Re: Zugriff auf ein TImage einer externen Anwendung
 
Ich sollte vorher auch die Änderungen abspeichern bevor ich die Zip erstelle

sirius 27. Feb 2007 14:45

Re: Zugriff auf ein TImage einer externen Anwendung
 
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 :mrgreen: ).

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;

KoS 28. Feb 2007 16:31

Re: Zugriff auf ein TImage einer externen Anwendung
 
Hallo,

also ich hab jetzt die Änderungen mal eingepflegt, aber das Form wird trozdem mit einer Zugriffsverletzung geschlossen (abgefangen durch das Hauptform). So wie es mit der letzten Version von deinem Programm auch war.

Dann hängt dein Programm ein bisschen um gibt Folgendes nach ner kleinen Weile aus:
Delphi-Quellcode:
Debug(1): FFFF015E

sirius 28. Feb 2007 17:30

Re: Zugriff auf ein TImage einer externen Anwendung
 
Die Exception-Bahndlung funktioniert nicht? Schade. Klappt sie mit dem Beispielprogramm?
Das wäre nämlich jetzt nicht schlecht, dann könten wir mit einer For Schleife mal etwas probieren. Ich habe nämlich, das Gefühl, dass die 9 nicht stimmt. Bzw. Ich bin mir dessen sicher, nur vielleicht haben wir Glück und es ist nur die 9.

Ich schau mir das später mal an, was du geschickt hast. Du kannst ja derweil mal mit andern Zahlen testen und dir das Ergebnis merken

KoS 28. Feb 2007 18:38

Re: Zugriff auf ein TImage einer externen Anwendung
 
Zitat:

Zitat von sirius
Die Exception-Bahndlung funktioniert nicht? Schade. Klappt sie mit dem Beispielprogramm?

Was heißt funktioniert nicht, ursprünglich war es ja so das mir der fremde Prozess komplett abgestürzt bzw. beendet worden ist, ohne eine Meldung.
Aber das hast du ja relativ schnell gefixt und dann gab es nur noch die Zugriffsverletzung bezüglich dem Form, was dann das Hauptform des fremden Prozess angezeigt hat.
Sogesehen hat sich nichts geändert, das Zielform schließt sich also nach wie vor noch, was du glaub ich mit deiner Exception-Behandlug verhindern wolltest.

Die Frage ob es bei meinem Beispielprogramm funktioniert ist etwas schwer zu beantworten. Ich sags mal so, da ich in meinem Testprogramm ja keine Zugriffsverletzung bekomme würde ich sagen sie funktioniert. D.h ich hab ja auch vorher schon keine bekommen.

Zitat:

Zitat von sirius
Das wäre nämlich jetzt nicht schlecht, dann könten wir mit einer For Schleife mal etwas probieren. Ich habe nämlich, das Gefühl, dass die 9 nicht stimmt. Bzw. Ich bin mir dessen sicher, nur vielleicht haben wir Glück und es ist nur die 9.

Ich nehme mal an du meinst diese 9?
Delphi-Quellcode:
p:=pointer(getwindowlong(myhandle,gwl_wndproc)+9);

sirius 28. Feb 2007 19:17

Re: Zugriff auf ein TImage einer externen Anwendung
 
Ja, ich meinte diese 9

Um zu testen, ob die Exception-Behandlung beim Testprogramm funktioniert, musst du einfach nur diese Zahl auf 10 oder so ändern, damit löst du auch beim Testprogramm eine Exception aus. Wollte nur wissen, ob es an deinem Compiler liegt. Denn Pascal und ASM zu mixen bringt meistens Probleme. Da muss man sich den Compiler genau anschauen. Wenn es nämlich in deinem Testprogramm auch nicht funktioniert, dann liegts an deinem Compiler. (und ich wüsste auch schon welche Stelle, aber ich kanns nicht korrigieren). Ich könnte dir dann die fertigen EXEn schicken.
Also einfach mal mit dem Testprogramm (PImage) probieren. Einmal die 9 und einmal die 10 bei getwindowlong, bei der 9 sollte alles nornmal laufen und bei der 10 eine EAccesviolation.

Das war aber eigentlich nur mal so Beiwerk. Allerdings hätte ich mit diesem Beiwerk ein kleines Programm schreiben können, was ein bisschen automatisch probiert, wie ich die Adressrechnung gestalten sollte.

Namenloser 28. Feb 2007 19:18

Re: Zugriff auf ein TImage einer externen Anwendung
 
Wow, dass ihr so viel zeit investiert, nur um ein image einer anderen anwendung auszulesen :shock:

sirius 28. Feb 2007 19:19

Re: Zugriff auf ein TImage einer externen Anwendung
 
Zitat:

Zitat von NamenLozer
Wow, dass ihr so viel zeit investiert, nur um ein image einer anderen anwendung auszulesen :shock:

Der olympische Gedanke zählt :zwinker: Soviel Zeit ist es außerdem gar nicht.

sirius 1. Mär 2007 08:27

Re: Zugriff auf ein TImage einer externen Anwendung
 
Evtl. funktioniert dieses Exception-handling besser (Eigentlich müsste ich da mal exakt drüber lesen, wo was nach einer Exception zu finden ist, hab aber grad nicht die Zeit).
Hier der erste Teil (am anfang von Info), der Rest bleibt gleich.
Delphi-Quellcode:
asm
    xor edx,edx
    mov isexception,edx
    push ebp
    call @@1
   @@1:
    add [esp],12
    push dword ptr fs:[edx]
    mov dword ptr fs:[edx],esp
    jmp @@try
   @@except:
    mov eax,esp
    add eax,4
    mov esp,[esp+8]
    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
    mov edx,[eax+12]
    mov lparam,edx
   @@try:
 end;
Jetzt brauchst du zumindest die unsicher Variable "myexception" nicht mehr

KoS 1. Mär 2007 10:14

Re: Zugriff auf ein TImage einer externen Anwendung
 
Mir fällt grad auf du hattest das mit der +9 ja noch geändert:
Delphi-Quellcode:
p:=pointer(cardinal(memory^.oldwindowproc)+9);
D.h. das mit dem getlongwindow machst du ja an einer anderen Stelle. Ich hatte das glaub ich aus dem Forum korpiert und nicht mehr darauf geachtet was du in dem Code hattest. ;-)

Zitat:

Zitat von sirius
Ich könnte dir dann die fertigen EXEn schicken.

Das könntest du mal tun, damit ich seh wie es "eigentlich" funktionieren soll, oder ob es das selbe macht wie meins.

Zitat:

Zitat von sirius
Also einfach mal mit dem Testprogramm (PImage) probieren. Einmal die 9 und einmal die 10 bei getwindowlong, bei der 9 sollte alles nornmal laufen und bei der 10 eine EAccesviolation.

So... jetzt könnt ich mir erstmal in den A.... beißen! Hab das grad mal versucht, beim ersten mal mit der 9 lief alles glatt, dann bei der 10 gabs die Zugriffsverletzungs-Meldung im Testprogramm.

Und nun der Hammer! Ich hab mal die dcu gelöscht (was ich bisher leider nicht gemacht hab) und nun bekomm ich auch Zugriffsverletzungen bei der 9 und das Suchprogramm hängt sich auf! Und jetzt soll man noch den Fehler finden? Ich wette der Fehler wäre schon viel früher gekommen hätte ich mal ordentlich wie es sich gehört die dcu gelöscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.
Seite 6 von 12   « Erste     456 78     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz