AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) TreeView einer anderen Anwendung aus modifizieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView einer anderen Anwendung aus modifizieren

Ein Thema von golisan · begonnen am 17. Dez 2017 · letzter Beitrag vom 19. Dez 2017
Antwort Antwort
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#1

TreeView einer anderen Anwendung aus modifizieren

  Alt 17. Dez 2017, 14:54
Hallo zusammen,

mein Delphi-Programm wird von einer anderen Anwendung per DCOM aufgerufen. Zusätzlich erhalte ich ein Handle auf einen Treeview.
Diesen Treeview möchte ich nun modifizieren. Im ersten Schritt alle Knoten löschen und dann neue einfügen.
Das klappt noch nicht so ganz. Ich kann die Anzahl der Knoten ermitteln und alle Knoten löschen.
Nur das Einfügen neuer Knoten funktioniert leider nicht.
So lösche ich die Knoten
 TreeView_DeleteAllItems(wnd); und so versuche ich sie einzufügen:
Delphi-Quellcode:
var
tvi: TTVInsertStruct;

ZeroMemory(@tvi, sizeof(tvi));
tvi.hParent := nil; // root Element
tvi.hInsertAfter := TVI_SORT;
tvi.item.mask := TVIF_TEXT ;
tvi.item.pszText := PChar(feNatname);
tvi.item.cchTextMax := SizeOf(PChar(feNatname));

root := TreeView_InsertItem(wnd, tvi);
Jetzt habe ich schon einiges gelesen, dass man Controls anderer Prozesse nicht modifizieren kann.
Aber wieso würde dann das Löschen funktionieren aber nicht das Anlegen.
Danke.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#2

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 17. Dez 2017, 15:28
Hier übergibst du Referenzen auf Strings/PChars, die in deinem Prozessspeicher liegen.
Beim Löschen wird das nicht gemacht.

Da diese Befehle aber in dem anderen Prozess ausgeführt werden, zeigt dort der PChar auf etwas "Anderes" und es kann nicht funktionieren, wenn du vorher nicht auch den Speicher des String/PChar in den anderen Prouessspeicher kopierst.

Bei einigen Messages, wie z.B. WM_SETTEXT/SetWindowText oder WM_COPYDATA, übernimmt Windows das Rüberkopieren des Speichers.
Andere Messages, wie z.B. TVM_INSERTITEM/TreeView_InsertItem, tun das eben nicht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Dez 2017 um 15:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 17. Dez 2017, 16:23
Du musst dir Speicher im fremden Prozess reservieren. Dort die TreeveieItem-Struktur füllen, sie in deinen Prozess kopieren, dort modifizieren und dann wieder in den anderen Prozess zurückkopieren.

Guck dir dazu mal mein ProgrammLuckieDIPs an: http://michael-puff.de/Programmierung/Delphi/Programme/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#4

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 18. Dez 2017, 06:43
Danke für eure Hinweise.
Leider ist prozessübergreifende Speicherreservierung nicht mein tägliches Geschäft
Deshalb kenne ich mich da nicht aus. Könntet ihr bitte etwas konkreter werden?
(@Luckie: ich habe in deine Programme rein geschaut aber leider nicht verstanden)
Ich habe auch das hier gefunden:
http://www.delphipraxis.net/46524-post1.html
Aber da geht es um das Auslesen eines TreeViews und nicht um die Modifizierung eines TVs.
Aber das eine oder andere Statement werde ich wohl auch brauchen...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 18. Dez 2017, 07:15
Und du bist dir sicher das das andere Programma im Hintergrund nicht weitere Infos zu jedem Treeknoten hält und deine Aktionen im Endeeffekt nur eine Absturz produzieren wird.?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#6

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 18. Dez 2017, 07:19
Ja, da bin ich sicher, da ich den TreeView "auf der anderen" Seite auslese.
Es geht auch rein nur um den Text im Knoten. Keine Bilder oder versteckten Informationen.
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#7

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 18. Dez 2017, 10:09
Mit dem Code, der notwendig ist, um in anderen Prozessen Speicher zu schreiben, landest Du ganz schnell in diversen Antivirus-Heuristiken und damit Erklärungsnot.

Nur aus dem "Auslesen" eines TreeView auf anderer Seite kann man nicht folgern, dass da nicht noch weitere Daten mit verknüpft sind. Im Gegenteil, vernünftige Programme werden Benutzerschnittstelle und Daten getrennt haben, und nur weil die Benutzerschnittstelle die Daten nicht (für Dich sichtbar) referenziert, kannst Du nicht folgern, dass es nicht anders herum der Fall ist.

Es dürfte wesentlich sicherer sein, den Autor des anderen Programmes um eine IPC-Schnittstelle zu bitten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#8

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 18. Dez 2017, 10:15
Ja, da bin ich sicher, da ich den TreeView "auf der anderen" Seite auslese.
Du liest nur den Tree in der WinAPI aus, aber z.B. im Delphi gibt es zu jedem Knoten noch ein TreeNode-Delphi-TObjekt, das du nicht so einfach auslesen kannst und das ist auch in anderen GUI-Frameworks genauso.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#9

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 18. Dez 2017, 11:50
Das "andere" Programm ist die Entwicklungsumgebung "NATURAL Studio" der Programmiersprache NATURAL. Diese NATURAL-Programme bestehen aus Subroutinen(ähnlich Basic). Ich möchte nun in einem TreeView alle Subroutinen des aktuellen Programmes auflisten und mit Doppelklick wird an die entsprechende Sourcecodestelle positioniert.(ähnlich der Projektverwaltung oder Klassenstruktur der Delphi-IDE).
Diese IDE lässt sich per PlugIns erweitern. Diese PlugIns sind auch in NATURAL geschrieben und in dieser Sprache gibt es Dinge wie Speicher reservieren nicht. Ich bin froh, dass eine DCOM-Schnittstelle gibt und ich Delphi rufen kann.
In diesem Plugin lege ich einen Treeview mit einem Dummy-Knoten an und übergebe das Handle an Delphi. Dort kann ich mit
 TreeView_DeleteAllItems(wnd); diesen Knoten löschen. Das tut.
Also habe ich Zugriff auf das Treeview-Objekt, richtig? Sogar "schreibend".
Lege ich aber mittels
Delphi-Quellcode:
ZeroMemory(@tvi, sizeof(tvi));
tvi.hParent := nil;
tvi.hInsertAfter := TVI_FIRST;
tvi.item.mask := TVIF_TEXT ;
tvi.item.pszText := PChar(feNatname);
tvi.item.cchTextMax := SizeOf(PChar(feNatname));

root := TreeView_InsertItem(wnd, tvi);
ein Element an, sehe ich es zumindest nicht. (im Debugger ist root aber <> Nil) Liegt das nur am PChar oder hängt das neue Item gar nicht an meinem Tree?
Müsste ich meine erzeugten Knoten noch irgendwie in den anderen Prozess schieben?
Irgendwie so?
WriteProcessMemory(hProc, pAddr, @tvi, sizeof(TV_ITEM), dwTmp)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#10

AW: TreeView einer anderen Anwendung aus modifizieren

  Alt 19. Dez 2017, 09:52
Nein, Dein Beispiel schreibt ja nur das tvi - der Text ist aber nur ein Zeiger.

Anstelle im Prozess-Speicher rumzupopeln würde ich nochmal das Stichwort IPC empfehlen, vor allem da das ja nun so klingt, als hättest Du die andere Seite auch unter Kontrolle. Oder sogar noch einfacher: kannst du dem Delphi-Teil nicht einfach einen callback nennen, den der zur Erstellung von neuen Einträgen aufrufen soll?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 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