Hallo zusammen,
ich bin gerade dabei mich in Dll´s und alles was damit zusammenhängt einzuarbeiten.
Dabei bin ich auf die Möglichkeit gestoßen, DLL´s dynamisch einzubinden.
Dabei habe ich gesehen, dass es den klassischen Weg gibt in dem ich die Funktion im "Type" abschnitt vordefiniere, mir eine Variable davon anlege und mittels @Variable und GetProcAddress die Adresse aus der Dll hole.
In einem anderem Programm habe ich gesehen, dass das Ergebnis von GetProcAddress direkt auf eine Variable vom Typ TFarProc übergeben wird. Nach etwas nachlesen in den Units bin ich drauf gekommen, dass es sich dabei ja eigentlich um einen ganz normalen Pointer handelt. (Hoffe des stimmt soweit)
Jetzt zu meiner Frage.
Warum geht so etwas (Beispiel aus einem Forum), speziell der markierte Bereich sollte analog meinen unteren Beispiel sein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var i, j: Integer; p1: ^Integer; p2: Pointer; begin i := 1; p1 := @i; p1^ := p1^ + 1; j := p1^; p2 := @i; Integer(p2^) := i + 1; j := Integer(p2^); end. |
Das hier aber nicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type
TFNFunktion = procedure (); stdcall;
var FunktionsPointer: TFarProc = Nil;
procedure DllEinlesen() var DllHandle: THandle; begin DllHandle := LoadLibrary('DllName');
FunktionsPointer := GetProcAddress(DllHandle, 'Funktionsname'); end;
procedure TForm1.Button1Click(Sender: TObject) begin TFNFunktion(FunktionsPointer^); end; |
Ich für mein Verständnis würde sagen es müsste gehen, tut es aber nicht. Vom Mechanismus her müsste des doch sein, schau auf die Adresse und mache abhängig von dem Typ das was an der Adresse steht.
Was schon geht um alle zu erklären was ich getestet habe ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| type
TFNFunktion = procedure (); stdcall;
var FunktionsPointer: TFarProc = Nil; Funktion: TFNFunktion = Nil;
procedure DllEinlesen() var DllHandle: THandle; begin DllHandle := LoadLibrary('DllName');
FunktionsPointer := GetProcAddress(DllHandle, 'Funktionsname'); end;
procedure TForm1.Button1Click(Sender: TObject) begin @Funktion := FunktionsPointer; Funktion; end; |
(Ich habe meine Beispiele frei runter geschrieben, da mein Programm noch umfangreicher ist und daraus wahrscheinlich nicht klar geworden wäre auf was ich hinaus will. Daher ist es gut möglich, dass ein Rechtschreib- oder Formellerfehler drin ist. Darum geht es mir auch nicht, sondern nur um das Verhalten von Pointer bei Funktionsaufrufen.)
Ach so der Fehler den ich bekomme wenn ich das mittlere Beispiel versuche ist:
Quelltext
1:
| Zugriffsverletzung bei Adresse 00000000006F5EC2 in Modul 'Anwendung.exe'. Lesen von Adresse FFFFFFFFFFFFFFFF. |
Bin schon auf eure Antworten gespannt.
Gruß,
Jack
Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am So 24.05.2015 um 22:46
Es gibt keine dummen Fragen, nur dumme Antworten.