| |
|
|
| Als Ausgangspunkt para unsere Betrachtungen se una vez folgender Ver código fuente herhalten:
Declarar Treeview3&,TV_INSERT#,TV_TEXT$,Parent&,Child&,Neu&
Windowstyle 31
Windowtitle "Treeviewtest"
Ventana 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 se erstellt
Der erste Eintrag des Treeviews se erstellt
Claro TV_INSERT#
LET TV_TEXT$="Root" Der Texto en el Label.
long TV_INSERT#,0=0 Der Eintrag es el erste Eintrag en el Treeview.
long TV_INSERT#,4=$FFFF0002 Der Eintrag kommt a el Schluß.
long TV_INSERT#,8=$0001 Nur Texto, no más Angaben para Eintrag.
long TV_INSERT#,24=@ADDR(TV_TEXT$) Adresse des Textes des Eintrags.
long TV_INSERT#,28=$FFFF Maximale Longitud des Eintrags.
@sendmessage(Treeview3&,$1100,0,TV_INSERT#) Message para Einfügen uno Eintrages.
Imprimir "Handle des angezeigten Treeviews: "+@STR$(Treeview3&) Daten voluntad a Kontrolle ausgegeben.
Let Treeview3&=@val(@Entrada$("Handle uno Treeviews eingeben:","Handle",@Str$(Treeview3&))) Das Handle uno Treeviews kann eingegeben se. Standardmäßig es hier el erzeugte Treeview.
LET Parent&=@SendMessage(Treeview3&,$110A,0,0) Der erste Eintrag dieses Treevies se ermittelt.
PRINT "Handle des Rootitems des eingegebenen Treeviews: "+@str$(Parent&) Daten voluntad a Kontrolle ausgegeben.
LET Child&=@SendMessage(Treeview3&,$110A,$4,Parent&) Der nachfolgende Eintrag bajo el ersten Eintrag se ermittelt.
PRINT "Handle des ersten Kinditems des eingegebenen Treeviews: "+@str$(CHILD&) Daten voluntad a Kontrolle ausgegeben.
Imprimir "Zeit="+@Time$(0) Daten voluntad a Kontrolle ausgegeben.
Der zweite Eintrag des Treeviews se erstellt
Claro TV_INSERT#
LET TV_TEXT$=@Time$(0)+" Dies es una Treeview-Test! Dies es una Treeview-Test! Dies es una Treeview-Test! Dies es una Treeview-Test! Dies es una Treeview-Test! Dies es una Treeview-Test! Dies es una Treeview-Test!" Der Texto en el Label
long TV_INSERT#,0=Parent& Der zweite Eintrag se bajo el Rooteintrag erstellt.
long TV_INSERT#,4=$FFFF0002 Der Eintrag kommt a el Schluß.
long TV_INSERT#,8=$0001 Nur Texto, no más Angaben para Eintrag.
long TV_INSERT#,24=@ADDR(TV_TEXT$) Adress of Label
long TV_INSERT#,28=$FFFF Maximale Longitud des Eintrags.
LET NEU&=@sendmessage(Treeview3&,$1100,0,TV_INSERT#) Message para Einfügen uno Eintrages.
PRINT "Handle des neuen Treeviewitems: "+@STR$(Neu&) Daten voluntad a Kontrolle ausgegeben.
Tiempo para nachsehen y nachdenken geben...
Mientras que 0=0
Waitinput Schnarchpause einlegen....
wend
Disponer TV_INSERT# Müll wegräumen...
Bitte simplemente siempre OK drücken y vorerst en el Eingabefeld nichts verändern. En me sieht el Geschichte una Haga doble clic en en el Eintrag ROOT entonces así de:
[...]
Uns se vorerst una vez no Rooteintrag, pero el Eintrag con el Uhrzeit darunter interés. Das de el Message TVM_INSERTITEM zurückgegebene Handle dieses Eintrags lautet en me 36687824. Nun kommt otra vez TNT en el Spiel. Nachdem wir en el Treeview de TNT el gerade erzeugten Prozess angeklickt haben, hacer wir veces otra vez el altbekannte Spiel y tun bastante frech así, como wäre el Handle una Adresse. Dazu dejar nosotros el Heaps des Prozesses listen - si al Programa no con Profano2Cpp compiliert, puede Listing algo después de el Heapblockadresse el el Handle entspricht (36687824) erreicht wurde, con el Taste PAUSE abgebrochen voluntad. Nun suchen wir veces el Heapblockstartadresse, el el Handle des Treevieweintrags entspricht y dejar uns el Inhalt des Blocks como dezimale Doublewords Mostrar:
[...]
Folgendes se en me adecuado: [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 es hier scheinbar el Handle des übergeordneten Eintrags, el es ligeramente ersichtlich. Nun schauen nosotros veces X4 a. Wir tun otra vez así, como wäre el Doubleword X4 una Adresse (hoffentlich Será mejor que te va no langweilig) y schauen después de, si wir una Heapblock encontrar, dessen Startadresse dieser Adresse (en me 3668872) entspricht y dejar uns entonces el Inhalt des Heapblocks como String darstellen. So siehts en me de:
[...]
Como uno sieht, hier es el Texto des Treevieweintrages. Das Handle, el wir por el Senden el Message TVM_INSERTITEM y el así verbundene Erstellen uno neuen Treevieweintrags obtener, es also also el Handle des Heapblocks, en el el Eintrag es - y el Handle entspricht genau el Startadresse des Blockes. Eingentlich sieht el sí bastante unspektakulär de, es pero no - porque qué wichtig es, Es el Tatsache Yo hier por einfaches senden de Messages una Adresse uno Speicherbereiches - tal vez auch innerhalb uno fremden Prozesses - erhalte. Un weitere, muy interessante Geschichte es, daß se el Heapblock con el Texto des Items sólo wenig oberhalb dieser Adresse befindet. Jetzt se algo phantasiegeladen: Wenn lo nun posible wäre, una Treevieweintrag en un fremden Prozess a erzeugen, sería me con el Erzeugung igual una Adresse mitgeliefert voluntad. Statt Texto podría Yo beim Erzeugen una DLL con Ver código fuente übertragen y cuando el Senden el Message TVM_INSERTITEM erhaltene Adresse podría Yo como Ausgangspunkt dafür nehmen, el en el DLL enthaltenen Ver código fuente (mittels WM_TIMER, una Sache el Yo ya erfolgreich con un Multiedit durchgeführt habe) anzusprechen - y el sin irgendwelche Schreib- oder Leserechte en el Prozess a haben! Aber va el wirklich? Tiempo schauen...
Dazu necesario wir simplemente el ya bekannten Ver código fuente zweimal starten. Beim ersten Start clic wir beim Eingabefeld en OK, beim zweiten Start geben wir el Handle des Treeviews des ersten Prozesses (no des Eintrages) una y bestätigen entonces con OK: Zwischen el Starts el beiden Prozesse necesario necesariamente algunos Minuten mentira, el es muy wichtig. Das hier zeigt en me entonces el zuerst gestartete Prozess a:
[...]
Mmh - si uno no bastante genau hinsieht, war unser vorhaben erfolgreich. Was en näherer Betrachtung aber auffällt - el Uhrzeiten el beiden Einträge müßten sí unterschiedlich ser, son ellos pero no! Was es genau geschehen? Von me gibts hier folgende Erklärung: Was beim Senden uno Message übertragen se siempre sólo vier Doublewords - en unserem Fall wurde aquí como vierter Parámetro una Pointer, Así que el Startadresse el Struktur TV_INSERT#, übertragen. Der Empfänger el Message (Prozess Nummer eins) bezieht el con el Message übertragene Adresse komplett en seinen Adressbereicht. Como lo en el beiden Prozessen en el gleiche Programa es, es a dieser Adresse ebenfalls todavía el Struktur TV_INSERT# - qué en TV_TEXT$ es, unterscheidet se aber. Fazit: Messages übertragen no Estructuras pero sólo Adressen, que en el jeweils Aktuellen Prozess beziehen. .... - aber como funktioniert entonces el Zwischenablage? Tiempo schauen........... |
|
|
| |
|
|