![]() |
Re: Übersetzung Class MagneticWindow
Push..
:duck: Niemand eine Idee ? Vielleicht hilft das noch etwas! Zitat:
|
Re: Übersetzung Class MagneticWindow
Diese Anweisung fummelt im Arbeitsspeicher rum und ändert Bytes. Da die Compiler bestimmt nicht gleich sind (VB <-> Delphi), ist die Frage ob dieser Code überhaupt noch funktioniert. Daher ist eher die Frage, was soll der Code bewirken? Weil so kannst du ihn wohl nicht übernehmen. Daher müssen wir nach einer anderen Lösung mit gleichem Effekt suchen...
|
Re: Übersetzung Class MagneticWindow
Zitat:
Die Variable VarPtr zeigt(gibt) die adresse von sc_aBuf(1)) zurück. ObjPtr zeigt auf die Adresse von der erstellen 'object instance' wäre in VB die cMagnetic ob es nun in Delphi die hInstance der Classe ist kann ich auch nicht sagen. Deshalb schwierig ;) Gruß |
Re: Übersetzung Class MagneticWindow
Zitat:
Daher die Frage: Nicht was machen die verwendeten Funktionen sondern, was soll der Code als gesamtes bewirken? |
Re: Übersetzung Class MagneticWindow
Zitat:
Delphi-Quellcode:
Patscht die adresse von der erstellten Objekt Instanz in einen statischen Maschinencode Buffer.
Call zPatchVal(VarPtr(sc_aBuf(1)), PATCH_0A, ObjPtr(Me))
Ich kann zwar die werte auslesen aber nicht so wie in Delphi dir genau sagen was sie bewirken Das kann man in vb nicht debuggen. Selbst von MS gibt es keine Documentation über diese Pointer was sie eigentlich tun. Habe aber hier einen ![]() Hmm ! Nicht das die ganze sache jetzt hier scheitert. wäre schade. gruß |
Re: Übersetzung Class MagneticWindow
Die Function wir in AddWindow aufgerufen!
Zitat:
Hier wird die Winproc gestartet und anschließend über Subclass_AddMsg die Messagen addiert. Ich muß nur noch durch die Subclass_Start dann ist die Classe funktions tüchtig. Ansonsten wie im Thread 1 Die Classe emuliert die exakten Dockeigenschaften wie sie auch in Winamp zur verfügung stehen. EDIT: ObjPtr übergibt die Klasseninstanz gibt es eine solche in Delphi ? Die Adresse des aktuellen Objektes. gruß |
Re: Übersetzung Class MagneticWindow
Habe nochmal im VB Forum nachgefragt wie man das Problem lösen könnte!
Hier die Antwort!
Code:
'Sub/Function....
'... 'Call zPatchVal(VarPtr(sc_aBuf(1)), PATCH_0A, ObjPtr(Me)) '... 'end Sub/Function 'VarPtr 'Die VarPtr-Funktion liefert Ihnen die Startadresse des Speicherbereichs zurück, 'in dem eine Variable (nicht notwendigerweise ihr Inhalt) gespeichert wird. 'ObjPtr 'Die ObjPtr-Funktion liefert Ihnen einen Zeiger auf das Interface eines instanzierten Objekts zurück. 'Hier ein Auszug aus der Offline MSDN (Me in der IDE tippen und F1) 'Das Schlüsselwort Me verhält sich wie eine implizit deklarierte Variable. 'Es steht allenProzeduren in einemKlassenmodul automatisch zur Verfügung. 'Wenn eine Klasse mehrere Instanzen haben kann, stellt Me eine Möglichkeit dar, 'um sich auf die jenige Instanz der Klasse zu beziehen, in der Code ausgeführt wird. 'Private Declare Sub RtlMoveMemory Lib "kernel32.dll" ( _ ' ByRef Destination As Any, _ ' ByRef Source As Any, _ ' ByVal Length As Long) ' 'Private Sub zPatchVal(ByVal nAddr As Long, ByVal nOffset As Long, ByVal nValue As Long) ''Patch the machine code buffer at the indicated offset with the passed value ' Call RtlMoveMemory(ByVal nAddr + nOffset, nValue, 4) 'End Sub
Code:
Wie ich das nun in Delphi vernünfig umsetzen kann ?
Es sieht so aus als würde ein Zeiger auf die aktuelle Instanz deiner Klasse in das Array sc_aBuf(), dessen Datentyp ich nicht kenne der aber vermutlich Long[4 byte] je Element ist, an die in PATCH_0A angegebene Byteposition kopiert wird.
Kein Ahnung.. gruß |
Re: Übersetzung Class MagneticWindow
Das bringt uns alles nicht weiter. Du kopierst einen Wert aus der Instanz in die Variable - das ist mir klar. Aber das können wir so nicht umsetzen - wie oft denn noch. Die Frage ist was der Code im Endeffekt bewirken soll. Was er da macht ist mir klar, aber die Frage ist: Was steht am Offset PATCH_0A der Instanz in VB? Was kopiert er da? Das ist die Frage. Selbst Me hatte ich mir schon gedacht. Ich kann dir den Code hier so in Delphi hinschreiben, da es für alles einen entsprechenden Code gibt - den würde ich hier auch ohne Probleme hinbekommen, aber er würde nix bewirken - naja. oder wahrscheinlich schon: einen Absturz. Die Frage, um das nochmals zu wiederholen, ist: Was bewirkt der Code im Endeffekt. Wozu braucht er den (unbekannten) Wert am Offset PATCH_0A der Instanz der Klasse. Was macht dieser Code? Hat es was mit den zuvor genannten Windows-Botschaften Behandlungsroutinen zu tun? Wenn ja, dann sag es, weil diese kannst du in Delphi einfach bedienen und handeln.
Nochmals zusammen gefasst: Der reine Code ist 1:1 so kovertierbar, aber er würde nicht das gleiche bewirken. Irgendwelche Offset Adressen die im internen Speicheraufbau der Instanzen rumwurschteln klappen so vllt. in VB, aber 120% nicht in Delphi, da hier an der Stelle was anderes steht. Daher ist die Frage: was steht an der Stelle in VB bzw. was soll der Code im ganzen bewirken (und damit meine ich nicht deine Klasse an sich als gesamtes). |
Re: Übersetzung Class MagneticWindow
Ich versuche es zu erklären und hoffe das es das ist was du meinst.
Es wird ein statischer MaschinenCode Buffer erstellt. sSubCode : string; Die länge des String als Const declariert ist CODE_LEN = 197; Am anfang der Function werden feste Positionen im Array festgelegt.
Delphi-Quellcode:
Bedeutet PATCH_0A befindet sich im sSubCode an der CODE_LEN Position (186). wert an dieser stelle in byte = 184
PATCH_02 = 68; //Address of the previous WndProc
PATCH_03 = 78; //Relative address of SetWindowsLong PATCH_06 = 116; //Address of the previous WndProc PATCH_07 = 121; //Relative address of CallWindowProc PATCH_0A = 186; //Address of the owner object sc_aBuf(1) zeigt auf den speicheranfang vom sSubCode HEX = '$55' byte 85 der ObjPtr zeigt auf die Klasseninstanz. Nun muß der wert der Klasseninstanz an die Position (sc_aBuf(1) + PATCH_0A) mit einer länge von 4 copiert werden.
Delphi-Quellcode:
Mit den anderen verhält es sich genauso sind festangelegte werte welche den Index im Array(sc_aBuf) repräsentieren.
procedure TMagnetic.zPatchVal(nAddr: Integer; nOffset: Integer; nValue: Integer);
//Patch the machine code buffer at the indicated offset with the passed value begin // nAddr=sc_aBuf(1) + nOffset=PATCH_0A, ObjPtr=Klasseninstanz, 4 CopyMemory(Pointer(nAddr + nOffset), Pointer(nValue), 4); End; Ich hoffe das reicht dir als erklärung.. Sorry das ich nicht verstanden habe was du eigentlich wolltest ;) Edit: Alle oben aufgeführte funktionen selbst die Winproc existieren nicht als code in der Classe sondern als MaschinenCode im speicher. Lediglich die Messagen werden im Code verwaltet. gruß |
Re: Übersetzung Class MagneticWindow
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz