Einzelnen Beitrag anzeigen

tommie-lie
(Gast)

n/a Beiträge
 
#28

Re: einer variable eine adresse zuweisen

  Alt 15. Jan 2005, 09:52
Zitat von c113plpbr:
Wie ist das zu verstehen?
Na, Variable exportieren, genauso wie 'ne Funktion:
Delphi-Quellcode:
library MyLibrary;

uses
  SysUtils, Dialogs;

var
  i: Integer;

procedure Something;
begin
  ShowMessage(IntToStr(i));
end;

exports
  Something, i;

begin
end.
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.

Zitat von c113plpbr:
Seit wann kann man variablen exportieren?
Keine Ahnung, mindestens seit Delphi 6.


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.
  Mit Zitat antworten Zitat