AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Übersetzung Class MagneticWindow

Ein Thema von EWeiss · begonnen am 9. Okt 2006 · letzter Beitrag vom 18. Dez 2006
Antwort Antwort
Seite 7 von 12   « Erste     567 89     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#61

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 20:38
Push..


Niemand eine Idee ?

Vielleicht hilft das noch etwas!

Zitat:
Die Funktionen VarPtr, ObjPtr und StrPtr. Während erstere die Adresse einer Variablen zurückgibt,
liefert die ObjPtr-Funktion die Adresse einer Objektvariablen.
Über StrPtr greifen Sie direkt auf einen String zu, was auch nützlich sein kann,
wenn Sie beim Aufruf einer API-Funktion die Umwandlung von ANSI in Unicode vermeiden möchten.
gruß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#62

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 20:42
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...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#63

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 20:48
Zitat von Muetze1:
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...
Korrekt deshalb oben die beschreibung was die pointer machen
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ß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#64

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 21:13
Zitat von EWeiss:
Korrekt deshalb oben die beschreibung was die pointer machen
Die Bedeutung war mir von der Benennung vorhin schon klar. Das Problem ist der Objektpointer. Der Code als gesamtes liest oder schreibt etwas von oder in die Objektinstanz. An der Stelle wo er dies tut klappt das vielleicht bei VB, aber ich denke wirklich nicht, dass es 1:1 übersetzt auch nur ansatzweise in Delphi klappen wird.

Daher die Frage: Nicht was machen die verwendeten Funktionen sondern, was soll der Code als gesamtes bewirken?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#65

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 21:30
Zitat von Muetze1:
Zitat von EWeiss:
Korrekt deshalb oben die beschreibung was die pointer machen
Die Bedeutung war mir von der Benennung vorhin schon klar. Das Problem ist der Objektpointer. Der Code als gesamtes liest oder schreibt etwas von oder in die Objektinstanz. An der Stelle wo er dies tut klappt das vielleicht bei VB, aber ich denke wirklich nicht, dass es 1:1 übersetzt auch nur ansatzweise in Delphi klappen wird.

Daher die Frage: Nicht was machen die verwendeten Funktionen sondern, was soll der Code als gesamtes bewirken?
Wenn du die Zeile meinst!
Call zPatchVal(VarPtr(sc_aBuf(1)), PATCH_0A, ObjPtr(Me)) Patscht die adresse von der erstellten Objekt Instanz in einen statischen Maschinencode Buffer.

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 Link!

Hmm ! Nicht das die ganze sache jetzt hier scheitert.
wäre schade.

gruß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#66

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 21:45
Die Function wir in AddWindow aufgerufen!

Zitat:
'-- Start subclassing
Call Subclass_Start(hWnd)
Call Subclass_AddMsg(hWnd, WM_ENTERSIZEMOVE)
Call Subclass_AddMsg(hWnd, WM_SIZING, [MSG_BEFORE])
Call Subclass_AddMsg(hWnd, WM_MOVING, [MSG_BEFORE])
Call Subclass_AddMsg(hWnd, WM_EXITSIZEMOVE)
Call Subclass_AddMsg(hWnd, WM_SYSCOMMAND)
Call Subclass_AddMsg(hWnd, WM_COMMAND)
Da bin ich zur zeit 'Subclass_Start'
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ß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#67

Re: Übersetzung Class MagneticWindow

  Alt 12. Okt 2006, 00:09
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:
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.
Wie ich das nun in Delphi vernünfig umsetzen kann ?
Kein Ahnung..

gruß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#68

Re: Übersetzung Class MagneticWindow

  Alt 12. Okt 2006, 01:04
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).
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#69

Re: Übersetzung Class MagneticWindow

  Alt 12. Okt 2006, 02:28
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:
    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
Bedeutet PATCH_0A befindet sich im sSubCode an der CODE_LEN Position (186). wert an dieser stelle in byte = 184
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:
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;
Mit den anderen verhält es sich genauso sind festangelegte werte welche den Index im Array(sc_aBuf) repräsentieren.

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ß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#70

Re: Übersetzung Class MagneticWindow

  Alt 12. Okt 2006, 10:09
Zitat von EWeiss:
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.
Wozu brauchst du dies? Wozu legst du Maschinencode hier in diesem Array ab und patcht die Instanzenadressen. Die Messagebehandlung und überschreiben der WndProc geht bei Delphi mit einfachsten OOP Mitteln, da brauchen wir sowas nicht. Ich möchte daher im ganz allgemeinen Worten wissen, was der Code bewirken soll. Was er macht und wie und wo er irgendwelche Daten hin- und herschreibt, das sehe ich am VB Code. Die Frage ist, wozu du den Code brauchst. Warum ist es nötig gewesen diesen Code bei deinem VB Programm einzufügen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 12   « Erste     567 89     Letzte »    


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 00:39 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