Re: Zugriff auf ein TImage einer externen Anwendung
Probiere es doch einfach aus. Bei meinem Beispiel, setzt du einfach den Cursor über das TMemo oder was auch immer, das Label zeigt dann den Text an, wenn er ausgelesen werden kann. Es gibt auch Programme dafür, wie zB. WinSpy.
Delphi-Quellcode:
function TextHolen(Handle: HWND): AnsiString;
begin SetLength(Result, SendMessage(Handle, WM_GETTEXTLENGTH, 0, 0)+ 1); SendMessage(Handle, WM_GETTEXT, Length(Result), integer(Result)); end; procedure TForm1.Timer1Timer(Sender: TObject); var Point: TPoint; begin Timer1.Interval:= 100; GetCursorPos(Point); Label1.Caption:= TextHolen(WindowFromPoint(Point)); end; |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
|
Re: Zugriff auf ein TImage einer externen Anwendung
Oky also ich hab es mal mit dem "Tool" von bitsetter Versucht, er zeicht mir zwar TEdit-Texte an, aber ansonsten nur die Form.Caption, nicht jedoch die TLabel.
Zitat:
Ich hatte vor längerem auch mal ein Programm gehabt das sämtliche Informationen von Prozessen ausgelesen hat, auch bei Mouse-Over. Infos über Class, Name, Text, Handle, Owner ... aber ich weiß nicht mehr wie das heißt. |
Re: Zugriff auf ein TImage einer externen Anwendung
Also ich habe Winspector um die Handles zu vergleichen und zu schauen was es so für windows gibt.
|
Re: Zugriff auf ein TImage einer externen Anwendung
Es gibt eventuell noch bessere Programme, aber hier sind welche, die genieren auch den Delphi Code für FindWindow().
WinSpy X-Spy eda_preview270.exe |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
|
Re: Zugriff auf ein TImage einer externen Anwendung
Ok, ich hab noch eine Idee. Vielleicht finden wir die WndProc von TLabel. Dazu müsstest du in deinem Programm in der Info-Prozedur mal nach jeder Adressrechnung eine Message schicken, damit ich weis, wie weit er ohne Fehler kommt.
|
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
Ich hab mal versucht am ende der Info-For schleife das einzusetzen
Delphi-Quellcode:
was bei mir aber für verwirrung sorgt, da jetzt eigentlich nur noch lauter 0 als Ausgabe kommt, nicht mehr die größe des TImage/TLabel (in Verbindung mit dem Testprogramm)
memory^.Postmessage(memory^.backwnd,memory^.backmsg,wparam,lparam);
|
Re: Zugriff auf ein TImage einer externen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
So, Um die Größe der Beiträge nicht weiter aufzublähen, hänge ich den Code mal unten drann (Ich hoffe ich habe nix vergessen)
Ich habe mal die Messages umbenannt und ein paar schönere Namen vergeben. Es gibt jetzt zwei Info Prozeduren. Die eine ist original und derzeit in geschweiften Klammern, also auskommentiert. Und die andere hat diese DebugMessages. Die ganze API Funktionen, wie z.B. Postmessage sind in der Windows SDK beschrieben. Liegt eigentlich jedem Delphi bei. Ist eine Kopie der Beiträge aus der msdn-Library. Postmessage sendet eine Nachricht. Dazu gibts da 4 Parameter. Der erste ist das Window-Handle, an welches die NAchricht geschickt werden soll. Das zweite ist einfach eine MessageNummer, damit wir die Message wiederfinden und der richtigen Bearbeitungsroutine zuordnen können. Die letzten beiden Parameter (wparam und lparam) sind zwei frei wählbare integer-Werte in der wir unsere Message schreiben. Edit: neue Version |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
D.h. nichts mit DebugInfo oder umbenannte Messages. ;-) |
Re: Zugriff auf ein TImage einer externen Anwendung
Ich sollte vorher auch die Änderungen abspeichern bevor ich die Zip erstelle
|
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:
ErrorMsg im Hauptprigramm bearbeiten:
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;
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; |
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
|
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 |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
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:
Delphi-Quellcode:
p:=pointer(getwindowlong(myhandle,gwl_wndproc)+9);
|
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. |
Re: Zugriff auf ein TImage einer externen Anwendung
Wow, dass ihr so viel zeit investiert, nur um ein image einer anderen anwendung auszulesen :shock:
|
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
|
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:
Jetzt brauchst du zumindest die unsicher Variable "myexception" nicht mehr
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; |
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:
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. ;-)
p:=pointer(cardinal(memory^.oldwindowproc)+9);
Zitat:
Zitat:
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. |
Re: Zugriff auf ein TImage einer externen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
Das häufige PostMessage macht irgendwie Probleme. Weis nicht warum, aber wenn ich 5 mal hintereinander dieselbe Message schicke bekommt das Programm einen Fehler. Wenn ich sie nur zweimal schicke dann nicht.
Ich hab jetzt mal as Programm angehängt (Code und Exe). Damit können wir gleich die 9 ein wenig "untersuchen". Wenn erstmal soweit alles funktionier und kein Programm abstürzt, dann kannst du die Zahlen "von" und "bis" ändern. Das sind dann die Zahen, die er so durchläuft. |
Re: Zugriff auf ein TImage einer externen Anwendung
ich hab jetzt nicht alles verfolgt was hier an code gelaufen ist, aber zum Thema Postmessage und sendmessage hab ich folgendes
Unterschied Postmessage und Sendmessage |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
|
Re: Zugriff auf ein TImage einer externen Anwendung
Also dein Programm/EXE tut genau das was es soll!!
Delphi-Quellcode:
So wie ich das allerdings hier an dem OnPaint sehe, sind da nicht die TImages die ich will. Da die Auflösung selbst nur 1024x768.
Debug: $00000000 $0B7B037E
Error: EAccessViolation @0B7B03D5 onPaint 1022 164 1024 167 onPaint 1021 164 1024 768 onPaint 152 160 1022 166 |
Re: Zugriff auf ein TImage einer externen Anwendung
Das onPaint sind die stellen im Fenster, die grad neu gezeichnet werden (wenn du ein anderes Fenster drüber schiebst) Darauf könntest du dann reagieren und selber mitzeichnen.
Die Zahlen hinter debug und Error schau ich mir am Wochenende mal an. Kannst du noch mal die Einträge "von" und "bis" ändern? Also von=5 und bis=35 z.B. |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
Zitat:
Delphi-Quellcode:
Debug: $00000000 $0BE1037E
Error: EAccessViolation @0BE103D5 |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
Oder im negativen, aber das geht in dem Programm nicht. |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
|
Re: Zugriff auf ein TImage einer externen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
So, jetzt kannst du auch mal im negativen stöbern...
Es gibt auch eine interessante Message mehr. Edit: Ich hab mal auf meinem anderen Rechner, wo Turbo Delphi Explorer drauf ist alles compiliert (Testprogramm und GetImage) und es gibt keine Probleme. Funktioniert alles. |
Re: Zugriff auf ein TImage einer externen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
(Schade, ich durfte oben nicht mehr editieren >24h)
Was unten anhängt wurde mit Turbo Delphi Explorer compiliert und zuvor editiert. also wie gehabt, einmal communicate drücken und die Ausgabe speichern Und dann neu hinzugekommen sind ein paar Funktionen zum disassemblen. Als erstes die Taste Memory, die den Speicherinhalt bei der Adresse der wndProc disassembled und dann kann man mit real Address weiter suchen (da sag ich dir wenn du mir den ersten Inhalt nach "Memory" beschreibst. |
Re: Zugriff auf ein TImage einer externen Anwendung
Also ich hab das jetzt mal ausprobiert. Programm bekommt keine Zugriffsverletzung.
Allerdings habe ich auch mal den bereich -200 bis 200 "gescannt" und habe trozdem immer noch kein Ergebnis, d.h. immer nur: Debug: $00000000 $0C27037E Error: EAccessViolation @0C2703E4 Ein klick auf Memory brachte auch kein Ergebnis. Zur Info: Bei meinem Testprogramm hat allse richtig Funktioniert. Ich werde mal noch weiter die Adresse abklappern, aber jenseits von 200 dürfte doch eigentlich nichts sein, oder? |
Re: Zugriff auf ein TImage einer externen Anwendung
Nee, ein Ergebnis bringt das jetzt nicht mehr. (Also Communicate könnte, aber das steht jetzt nicht im Vordergrund)
Mit Memory lesen wir den ersten relevanten Teil des speichers aus. Den brauch ich mal um zu sehen, warum die 9 nicht funktioniert. Kannst du den mir mal zukommen lassen (mit Speichern kannst du den Inhalt in eine TXT ablegen). |
Re: Zugriff auf ein TImage einer externen Anwendung
Wie ich bereits sagte, es steht nichts drin.
|
Re: Zugriff auf ein TImage einer externen Anwendung
Nach drücken von Memory steht nix drin (im Gegensatz zum Beispielprogramm)?
Evtl. erst Communicate drücken und dann nach etwa 10s auf Memory. Wenn dann nix kommt, weis ich auch nicht mehr weiter. Anscheinend stimmt etwas nicht mit der WndProc (also dem Zeiger dahin) |
Re: Zugriff auf ein TImage einer externen Anwendung
Habs grad nochmal probiert mit Communicate, ca. 10s warten und dann Memory. Ist leider das selbe Ergebnis, bzw. kein Ergebnis. Memo wird gecleared aber nicht gefüllt.
Kann es vielleicht sein das man sich vorwärts hangeln muss vom MainForm des fremden Prozesses zum eigentlichen Form? |
Re: Zugriff auf ein TImage einer externen Anwendung
Und was kommt bei deinem Testprogramm?
Nee, muss man eigentlich nicht, da du ja (hoffentlich) genau das Handle des "Ziel"-Formulars ermittelt hast. Oder, ah jetzt fällt mir etwas ein. Ist vielleicht, dass Zielformular nicht wirklich die Mainform wo der Titel steht? Allerdings müsste dann Memory trotzdem ein Ergebnis liefern, auch wenn es unbrauchbar ist. Memory macht nix weiter, als den speicher rund um die WndProc auszulesen und zu übersetzen (in Assembler). Damit wüsste ich, was dort steht und könnte dementsprechend reagieren. Communicate müsste eigentlich auch immer zwei Debug-Infos und dann eine ErrorMessage schicken. Alles komisch :gruebel: |
Re: Zugriff auf ein TImage einer externen Anwendung
Beim Testprogramm kommt der Assambler-Code.
Ich weiß nicht genau "wie" das Programm Funktioniert, aber das Ziel-Form ist "ein" Formular von meheren des Prozesses welches während der Laufzeit erzeugt wird und dann wieder geschlossen. (Ob nun Create oder Show weiß ich nicht). Und wie du ja gesehen hast, wird nur 1 Debug und 1 Error ausgegeben. Aber ich nehm an, da ja anfänglich das Ziel-Form durch Zugriffsverletzung geschlossen wurde, das es eigentlich schon irgendwie der korrekte Handle sein muss. |
Re: Zugriff auf ein TImage einer externen Anwendung
Zitat:
Evtl. kann man die speicherseiten dort nicht lesen :gruebel: |
Re: Zugriff auf ein TImage einer externen Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich hab mal mehr Fehlermeldungen eingebaut und versucht den Addressbereich lesbar zu machen. Testen kann ich leider nicht, da beim Beispielprogramm ja alles funktioniert.
|
Re: Zugriff auf ein TImage einer externen Anwendung
Hallo,
wenn KoS die Applikation in der er ein Image kontrollieren möchte mal zu Testzwecken sirius zur Verfügung stellen würde, dann könntet Ihr beide sicherlich schneller zu einem Ergebnis kommen. Voraussetzung ist natürlich, dass das Programm nicht zu umfangreich ist und die Lizenzvereinbarungen eingehalten werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr. |
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