![]() |
einer variable eine adresse zuweisen
Ist es möglich einer variable eine andere adresse zuzuweisen? Wenn ja, wie?
Ich will also quasi eine Variable, mit zwei Namen ... hört sich komisch an, macht aber in meinem Fall durchaus sinn ... ciao & thx, Philipp |
Re: einer variable eine adresse zuweisen
Vielleicht mittels eines Array's ?
Oder du machst einfach 2 Variablen mit gleichem Inhalt. |
Re: einer variable eine adresse zuweisen
Zitat:
Zitat:
ciao, Philipp |
Re: einer variable eine adresse zuweisen
Vielleicht geht das mit pointern, also einer Variable und einer Variable, die darauf zeigt. dann kannst du über beide den gleichen Inhalt erreichen ...
|
Re: einer variable eine adresse zuweisen
Zitat:
|
Re: einer variable eine adresse zuweisen
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var ValueA: Integer; ValueB: PInteger; begin ValueB := @ValueA; ValueA := 12; ShowMessage(IntToStr(ValueB^)); ValueB^ := 21; ShowMessage(IntToStr(ValueA)); end; |
Re: einer variable eine adresse zuweisen
Zitat:
[edit]dereferenziert, nicht referenziert ... hrmpf[/edit] ciao, Philipp |
Re: einer variable eine adresse zuweisen
Zitat:
Delphi-Quellcode:
type
TForm1 = class(TForm) ... private { Private-Deklarationen } FValue: Integer; public { Public-Deklarationen } property ValueA: Integer read FValue write FValue; property ValueB: Integer read FValue write FValue; end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ValueA := 12; ShowMessage(IntToStr(ValueB)); end; |
Re: einer variable eine adresse zuweisen
@Sprint: Das wäre ne idee ... aber bevor ich sowas mache, nehme ich lieber die pointer-dereferenzier-methode ... ^^
Nun, vielleicht ein paar "erklärungen" zu dieser Problemstellung: Ich bringe (m)eine DLL in den Speicher einers (fremden) Prozesses, um dort Funktionen aufzurufen, und Variablen zu verändern. Funktionsaufrufe sind relativ einfach, wenn man die Funktionen "deklariert" hat:
Delphi-Quellcode:
Nun wäre es natürlich sehr praktisch, wenn es mit Variablen genauso gehen würde. Es geht zwar, über (wie oben genannt) Dereferenzierung von Pointern, aber es wäre natürlich praktisch, wenn man z.B. vorhandenen code, ohne bei jeder variable darauf achten zu müssen ein ^ anzuhängen, kopieren könnte. Außerdem sieht es gleich unkomplizierter aus ... ^^
var
ProcABC : procedure(abc : DWORD); stdcall = pointer($01001234); ... ProcABC(12345); ciao, Philipp |
Re: einer variable eine adresse zuweisen
Vielleicht hilft dir
![]() |
Re: einer variable eine adresse zuweisen
Du suchst
![]()
Delphi-Quellcode:
Ich würde trotzdem den von Sprint gezeigten Weg empfehlen.
procedure TForm1.FormCreate(Sender: TObject);
var Foo: Integer; Bar: Integer absolute Foo; begin Foo := 42; ShowMessage(IntToStr(Bar)); end; |
Re: einer variable eine adresse zuweisen
Wenn ich sage:
Delphi-Quellcode:
Dann verweist doch b auch nur auf die Speicheradresse von a. Zumindest meint dies mein Informatiklehrer, ist das nicht korrekt?
a := 5;
b := a; |
Re: einer variable eine adresse zuweisen
Zitat:
Eine Speicheradresse weist man mit dem Adress-Operator an eine Zeigervariable zu:
Delphi-Quellcode:
var
a: Integer; pa: PInteger; begin a := 5; pa := @a; // pa zeigt auf die Speicheradresse von a end; |
Re: einer variable eine adresse zuweisen
Zitat:
Absolute würde warscheinlich gehen, wenn dies eine variable aus meiner DLL wäre, was aber nicht so ist. Und so wie ich das sehe, kann man mit absolute zwar exakt das tun was ich will, aber nur mit variablen, die in meinem quellcode deklariert sind ... oder geht da etwa was mit adressen? @Oxmyx: lies mal die anderern posts, und du wirst erfahren, dass ich dereferenzierungen im code vermeiden will, womit mir ein pointer darauf nicht besonders viel weiter hilft. ciao, Philipp |
Re: einer variable eine adresse zuweisen
Zitat:
|
Re: einer variable eine adresse zuweisen
hi,
ich hatte mal gehört, dass man z.B. einer Integer Variable keine neue Addresse zuweisen kann, da ein Integer nicht dynamisch, sondern schon vom Compiler im Code erstellt wird. Sprich: Der Compiler legt bei der Kompilierung schon 4 Bytes für einen Integer in der EXE Datei an. ich weiss aber nicht, ob dies auch auf den Delphi Compiler zutrifft und bitte um Berichtigung, wenns nicht stimmt. cu, stefan2005 |
Re: einer variable eine adresse zuweisen
eine neue adresse zuordnen kann man nicht. Deswegen arbeitet man in so einem fall ja auch mit Pointern, "absolute" und/oder propertys
|
Re: einer variable eine adresse zuweisen
Nagut, dann muss ich mich wohl geschlagen geben ... :|
trotzdem danke für eure ratschläge ... ciao & thx, Philipp |
Re: einer variable eine adresse zuweisen
was stört dich an der "absolute" Variante?
|
Re: einer variable eine adresse zuweisen
Zitat:
ciao, Philipp |
Re: einer variable eine adresse zuweisen
Zitat:
|
Re: einer variable eine adresse zuweisen
Zitat:
Delphi-Quellcode:
var
a : DWORD absolute $01005B24; b : DWORD absolute pointer($01005B24); Compilerausgabe: [Error] hook.dpr(14): E2088 Variable name expected ciao, Philipp |
Re: einer variable eine adresse zuweisen
Wenn du die Adresse kennst, warum nimmst du dann nicht einen Pointer? Angenommen du willst einen Pointer aus Adresse 12345678 haben, geht das z.B. so:
Delphi-Quellcode:
Da du aber sagtest, daß es nicht in deinem Quellcode ist, schwant mir fürchterliches... Es soll dir gesagt sein, daß du unter WindowsNT nicht ohne weiteres an Speicherbereiche von anderen Prozessen rankommst.
var
meineZahl: Integer; begin // die Zahl holen meineZahl := PInteger(12345678)^; // irgendwas damit machen // und zurückschreiben geht auch PInteger(12345678)^ := meineZahl; end; |
Re: einer variable eine adresse zuweisen
Zitat:
Lies die anderen Posts, dann weist du warum es geht, und dann wirst du auch herausfinden, warum dir nichts "fürchterliches zu schwanen" braucht. Ich habe meinen Code per DLL in einen fremden Prozess injeziert, womit ich auf alle Variablen die das programm beinhaltet _ohne_ probleme zugreifen kann, und zwar genauso wie das programm selbst. Nun, sag mir nicht, dass dies nicht möglich ist, denn es funktioniert. Leider eben nicht so wie ich das gerne hätte, sprich ohne dereferenzierung eines Pointers. ciao, Philipp |
Re: einer variable eine adresse zuweisen
Zitat:
Für den Fall fällt mir aber auch nichts anderes ein als der Pointer, wenn die Variable nicht exportiert wird. |
Re: einer variable eine adresse zuweisen
Zitat:
ciao, Philipp |
Re: einer variable eine adresse zuweisen
Moin Philipp,
wie wär's mit einem varianten Record?
Delphi-Quellcode:
MyValue = record
case byte of 0 : (ValueA : DWORD); 1 : (ValueB : DWORD); end; |
Re: einer variable eine adresse zuweisen
Zitat:
Delphi-Quellcode:
Das ganze hat nur den kleinen Haken, daß Delphi (zumindest 6) noch keine Möglichkeit zur Verfügung stellt, syntaktisch eine Variable auch wieder zu importieren, wie es mit Funktionen über das external-Statement möglich ist. Variablen muss man also mit GetProcAddress() aus der geladenen Bibliothek zusammensuchen.
library MyLibrary;
uses SysUtils, Dialogs; var i: Integer; procedure Something; begin ShowMessage(IntToStr(i)); end; exports Something, i; begin end. Zitat:
Aber mit absolute geht es nicht, da du keinen Zugriff auf den fremden Code hast, sonst bräuchtest du ja keine DLL. Ein variantes Record ist aus dem gleichen Grund ebenfalls keine Alternative, genauso wenig wie Properties oder sonstiges "Standard"-Zeug der Syntax. Die IMAGEBASE-Direktive bringt hier auch nichts, auch nicht wenn du die relative Adresse einer lokalen Variable wüsstest. Um auf die Variable zuzugreifen, wie man es normalerweise macht mit Variablen, die dazu gemacht sind, zugegriffen zu werden, müsste sie exportiert sein, damit du sie in deiner DLL aus dem Modul laden kannst. Außer dem Pointer fällt mir absolut nichts ein. Aber warum willst du denn Pointerdereferenzierung vermeiden? Es ist die normale und direkteste Methode auf eine Speicheradresse zuzugreifen, der erzeugte Assemblercode ist so, wie jeder normale Mensch es auch in Assembler schreiben würde: Adresse laden, Wert in die Speicherzelle schreiben, fertig. Wenn du nicht an das Symbol rankommst, wird das wohl die einzige Möglichkeit sein, aber selbst wenn du den Compilerirgendwie doch dazu überreden kannst, eine Variable nicht in dein Image zu nehmen sondern als variable Referenz an irgendeine Speicheradresse anzusehen, wäre ein Pointer sicherlich noch einfacher als die Suche nach der nicht-dokumentierten Compiler-Funktion und Sprach-Feature. ;-) Wenn es dir darum geht, daß du im fertigen Code nicht jedes Vorkommen von Foo durch Foo^ ersetzen willst, kannst du ja die Suchen&Ersetzen-Funktion nehmen. Und unübersichtlicher... also jeder Hack ist wahrscheinlich für jeden anderen komplexer als ein Pointer, den man dereferenziert, und ein einzelnes Zeichen am Namen angehängt ist ja nun wirklich nichts, was einen dermaßen verwirrt, daß man laut zu schreien anfängt und die Tapete von den Wänden kratzt. Edit: Ergännzt. |
Re: einer variable eine adresse zuweisen
@tommie-lie: löl, aber wie gesagt, ich habs ja schon aufgegeben ... ^^ ...
ciao, Philipp |
Re: einer variable eine adresse zuweisen
Zitat:
|
Re: einer variable eine adresse zuweisen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 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-2025 by Thomas Breitkreuz