Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TreeView einer anderen Anwendung aus modifizieren (https://www.delphipraxis.net/194652-treeview-einer-anderen-anwendung-aus-modifizieren.html)

golisan 17. Dez 2017 14:54

TreeView einer anderen Anwendung aus modifizieren
 
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
Delphi-Quellcode:
 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.

himitsu 17. Dez 2017 15:28

AW: TreeView einer anderen Anwendung aus modifizieren
 
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.

Luckie 17. Dez 2017 16:23

AW: TreeView einer anderen Anwendung aus modifizieren
 
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/

golisan 18. Dez 2017 06:43

AW: TreeView einer anderen Anwendung aus modifizieren
 
Danke für eure Hinweise.
Leider ist prozessübergreifende Speicherreservierung nicht mein tägliches Geschäft :roll:
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...

Bernhard Geyer 18. Dez 2017 07:15

AW: TreeView einer anderen Anwendung aus modifizieren
 
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.?

golisan 18. Dez 2017 07:19

AW: TreeView einer anderen Anwendung aus modifizieren
 
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.

CCRDude 18. Dez 2017 10:09

AW: TreeView einer anderen Anwendung aus modifizieren
 
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 ;)

himitsu 18. Dez 2017 10:15

AW: TreeView einer anderen Anwendung aus modifizieren
 
Zitat:

Zitat von golisan (Beitrag 1389159)
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.

golisan 18. Dez 2017 11:50

AW: TreeView einer anderen Anwendung aus modifizieren
 
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
Delphi-Quellcode:
 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?
Delphi-Quellcode:
WriteProcessMemory(hProc, pAddr, @tvi, sizeof(TV_ITEM), dwTmp)

CCRDude 19. Dez 2017 09:52

AW: TreeView einer anderen Anwendung aus modifizieren
 
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 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