Deutsch
Stammtisch & Café

TNT, ein Treeview im Speicher und das Kreuz mit

 
Als Ausgangspunkt für unsere Betrachtungen soll einmal folgender Quelltext herhalten:
Declare Treeview3&,TV_INSERT#,TV_TEXT$,Parent&,Child&,Neu&
Windowstyle 31
Windowtitle "Treeviewtest"
Window 0,0-640,440
DIM TV_INSERT#,48
Let Treeview3&=@control("SysTreeView32","Testtree",$40000000+$10000000+$800000+$200000+$0002+$0010+$0020+$10000+$800,10,100,600,300,%HWND,2603,%Hinstance) treeview wird erstellt
Der erste Eintrag des Treeviews wird erstellt
Clear TV_INSERT#
LET TV_TEXT$="Root"      Der Text im Label.
long TV_INSERT#,0=0         Der Eintrag ist der erste Eintrag im Treeview.
long TV_INSERT#,4=$FFFF0002 Der Eintrag kommt an den Schluß.
long TV_INSERT#,8=$0001 Nur Text, keine weiteren Angaben zum Eintrag.
long TV_INSERT#,24=@ADDR(TV_TEXT$)   Adresse des Textes des Eintrags.
long TV_INSERT#,28=$FFFF Maximale Länge des Eintrags.
@sendmessage(Treeview3&,$1100,0,TV_INSERT#) Message zum Einfügen eines Eintrages.
Print "Handle des angezeigten Treeviews: "+@STR$(Treeview3&) Daten werden zur Kontrolle ausgegeben.
Let Treeview3&=@val(@Input$("Handle eines Treeviews eingeben:","Handle",@Str$(Treeview3&))) Das Handle eines Treeviews kann eingegeben werden. Standardmäßig steht hier das erzeugte Treeview.
LET Parent&=@Sendmessage(Treeview3&,$110A,0,0) Der erste Eintrag dieses Treevies wird ermittelt.
PRINT "Handle des Rootitems des eingegebenen Treeviews: "+@str$(Parent&) Daten werden zur Kontrolle ausgegeben.
LET Child&=@Sendmessage(Treeview3&,$110A,$4,Parent&) Der nachfolgende Eintrag unter dem ersten Eintrag wird ermittelt.
PRINT "Handle des ersten Kinditems des eingegebenen Treeviews: "+@str$(CHILD&) Daten werden zur Kontrolle ausgegeben.
Print "Zeit="+@Time$(0) Daten werden zur Kontrolle ausgegeben.
Der zweite Eintrag des Treeviews wird erstellt
Clear TV_INSERT#
LET TV_TEXT$=@Time$(0)+" Dies ist ein Treeview-Test! Dies ist ein Treeview-Test! Dies ist ein Treeview-Test! Dies ist ein Treeview-Test! Dies ist ein Treeview-Test! Dies ist ein Treeview-Test! Dies ist ein Treeview-Test!"      Der Text im Label
long TV_INSERT#,0=Parent&         Der zweite Eintrag wird unter dem Rooteintrag erstellt.
long TV_INSERT#,4=$FFFF0002 Der Eintrag kommt an den Schluß.
long TV_INSERT#,8=$0001 Nur Text, keine weiteren Angaben zum Eintrag.
long TV_INSERT#,24=@ADDR(TV_TEXT$)    Adress of Label
long TV_INSERT#,28=$FFFF Maximale Länge des Eintrags.
LET NEU&=@sendmessage(Treeview3&,$1100,0,TV_INSERT#) Message zum Einfügen eines Eintrages.
PRINT "Handle des neuen Treeviewitems: "+@STR$(Neu&) Daten werden zur Kontrolle ausgegeben.
Zeit zum nachsehen und nachdenken geben...

While 0=0

    Waitinput Schnarchpause einlegen....

wend

Dispose TV_INSERT# Müll wegräumen...

Bitte einfach immer OK drücken und vorerst im Eingabefeld nichts verändern. Bei mir sieht die Geschichte nach einem Doppelklick auf den Eintrag ROOT dann so aus:

[...] 

Uns soll vorerst einmal nicht der Rooteintrag, sondern der Eintrag mit der Uhrzeit darunter interessieren.
Das von der Message TVM_INSERTITEM zurückgegebene Handle dieses Eintrags lautet bei mir 36687824.
Nun kommt wieder TNT ins Spiel. Nachdem wir im Treeview von TNT den gerade erzeugten Prozess angeklickt haben, machen wir mal wieder das altbekannte Spiel und tun ganz frech so, als wäre das Handle eine Adresse. Dazu lassen wir uns die Heaps des Prozesses listen - wenn man das Programm nicht mit Profan2Cpp compiliert, kann das Listing etwas nachdem die Heapblockadresse die dem Handle entspricht (36687824) erreicht wurde, mit der Taste PAUSE abgebrochen werden.
Nun suchen wir mal die Heapblockstartadresse, die dem Handle des Treevieweintrags entspricht und lassen uns den Inhalt des Blocks als dezimale Doublewords anzeigen:

[...] 

Folgendes wird bei mir angezeigt:
[box:fc91e92bbb]
X1=36685936
X2=0
X3=0
X4=36688672
X5=0
X6=0
X7=0
X8=131071
X9=-1412628479
X10=47382540
X11=393242
X12=524544
[/box:fc91e92bbb]
X1 ist hier scheinbar das Handle des übergeordneten Eintrags, das ist leicht ersichtlich. Nun schauen wir uns mal X4 an.
Wir tun wieder so, als wäre das Doubleword X4 eine Adresse (hoffentlich wirds nicht langweilig) und schauen nach, ob wir einen Heapblock finden, dessen Startadresse dieser Adresse (bei mir 3668872) entspricht und lassen uns dann den Inhalt des Heapblocks als String darstellen. So siehts bei mir aus:

[...] 

Wie man sieht, hier steht der Text des Treevieweintrages. Das Handle, das wir durch das Senden der Message TVM_INSERTITEM und das damit verbundene Erstellen eines neuen Treevieweintrags erhalten, ist also also das Handle des Heapblocks, in dem der Eintrag steht - und das Handle entspricht genau der Startadresse des Blockes. Eingentlich sieht das ja ganz unspektakulär aus, ist es aber nicht - denn was wichtig ist, ist die Tatsache daß ich hier durch einfaches senden von Messages eine Adresse eines Speicherbereiches - vielleicht auch innerhalb eines fremden Prozesses - erhalte. Eine weitere, sehr interessante Geschichte ist, daß sich der Heapblock mit dem Text des Items nur wenig oberhalb dieser Adresse befindet.
Jetzt wird etwas phantasiegeladen:
Wenn es nun möglich wäre, einen Treevieweintrag in einem fremden Prozess zu erzeugen, würde mir mit der Erzeugung gleich eine Adresse mitgeliefert werden. Statt Text könnte ich beim Erzeugen eine DLL mit Quelltext übertragen und die beim Senden der Message TVM_INSERTITEM erhaltene Adresse könnte ich als Ausgangspunkt dafür nehmen, den in der DLL enthaltenen Quelltext (mittels WM_TIMER, eine Sache die ich schon erfolgreich mit einem Multiedit durchgeführt habe) anzusprechen - und das ohne irgendwelche Schreib- oder Leserechte auf den Prozess zu haben!
Aber geht das wirklich? Mal schauen...

Dazu müssen wir einfach den schon bekannten Quelltext zweimal starten. Beim ersten Start klicken wir beim Eingabefeld auf OK, beim zweiten Start geben wir das Handle des Treeviews des ersten Prozesses (nicht des Eintrages) ein und bestätigen dann mit OK: Zwischen den Starts der beiden Prozesse müssen unbedingt einige Minuten liegen, das ist sehr wichtig.
Das hier zeigt bei mir dann der zuerst gestartete Prozess an:

[...] 

Mmh - wenn man nicht ganz genau hinsieht, war unser vorhaben erfolgreich. Was bei näherer Betrachtung aber auffällt - die Uhrzeiten der beiden Einträge müßten ja unterschiedlich sein, sind sie aber nicht! Was ist genau geschehen? Von mir gibts hier folgende Erklärung:
Was beim Senden einer Message übertragen wird sind immer nur vier Doublewords - in unserem Fall wurde hier als vierter Parameter ein Pointer, also die Startadresse der Struktur TV_INSERT#, übertragen. Der Empfänger der Message (Prozess Nummer eins) bezieht die mit der Message übertragene Adresse komplett auf seinen Adressbereicht. Da es sich bei den beiden Prozessen um das gleiche Programm handelt, steht an dieser Adresse ebenfalls noch die Struktur TV_INSERT# - was in TV_TEXT$ steht, unterscheidet sich aber.
Fazit: Messages übertragen keine Strukturen sondern nur Adressen, die sich auf den jeweils Aktuellen Prozess beziehen.
.... - aber wie funktioniert dann die Zwischenablage? Mal schauen...........

33 kB
Kurzbeschreibung: BILD 1
Hochgeladen:21.06.2006
Ladeanzahl101
Herunterladen
74 kB
Kurzbeschreibung: BILD 2
Hochgeladen:21.06.2006
Ladeanzahl70
Herunterladen
74 kB
Kurzbeschreibung: BILD 3
Hochgeladen:21.06.2006
Ladeanzahl91
Herunterladen
38 kB
Kurzbeschreibung: BILD 4
Hochgeladen:21.06.2006
Ladeanzahl82
Herunterladen
 
21.06.2006  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

866 Betrachtungen

Unbenanntvor 0 min.
Manfred Barei27.02.2020
Julian Schmidt22.08.2011
Frank Vorholzer25.06.2011
Dieter Zornow01.04.2011

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

unbekannt (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie