![]() |
Exportierte Funktion aus Exe mit GetProcAddress
Hallo,
Der Titel ist etwas unklar glaube ich daher eine Erklärung: Ich habe eine Programm, das dynamisch per LoadLibrary eine DLL lädt. Jetzt möchte ich aus der DLL heraus eine von der EXE exportierte Funktion aufrufen (quasi "falsch rum"). Das müsste doch möglich sein oder nicht? Code sieht ca. so aus:
Delphi-Quellcode:
library MeineDLL;
uses MeineDLLUnit; begin end.
Delphi-Quellcode:
Hier noch ein kleiner Ausschnitt aus der exe:
unit MeineDLLUnit;
interface function GetModuleHandleW(lpModuleName: PChar): Cardinal; stdcall; external 'kernel32.dll'; function GetProcAddress(hModule: Cardinal; lProcName: PChar): Pointer; stdcall; external 'kernel32.dll'; implementation var hMod: Cardinal; DemoFunc: function: Integer; dummy: Integer; initialization hMod := GetModuleHandleW(nil); DemoFunc := GetProcAddress(hMod, 'Demo'); dummy := DemoFunc(); end.
Delphi-Quellcode:
Ich bekomme von GetProcAddress aber immer nil zurück.
program MeineExe;
function Demo: Integer; begin Result := 1234; end; exports Demo; begin // ... LoadLibrary('MeineDLL.dll'); // Absoluter Pseudocode // ... end. Habe debugged und GetModuleHandleW liefert den richtigen Wert zurück. Aber GetProcAddress schlägt dann fehl mit GetLastError = ERROR_PROC_NOT_FOUND :( Der PE Explorer findet die "Demo" Funktion in der exe. |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Ich bin mir nicht sicher ob Delphi aus einer Exe wirklich exportiert.........
Aber ansonsten: Use LoadLibraryEx Function and DONT_RESOLVE_DLL_REFERENCES parameter |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Liste der Anhänge anzeigen (Anzahl: 1)
Wie schon oben reineditiert: (siehe Anhang)
Mit LoadLibraryEx + DONT_RESOLVE_DLL_REFERENCES wird die DLL gar nicht initialisiert. (Mein Code wird gar nicht ausgeführt). Das ist auch nicht Sinn der Sache :mrgreen: |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Kann sein das ich das nicht mehr richtig im Kopf hatte.
Aber ansonsten was spricht gegen eine CallBack Function die Du als Parameter an die Dll übergibst? Das wäre wohl der "normale" Weg.... |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Ja,dass geht problemlos. Morgen gerne mit Code.
Aber warum definierst du die Get... selbst? Die sind doch bestimmt in Winapi.Windows schon drin. Die Module-Handles mit Cardinal zu definieren ist jedenfalls so unschön/fehleranfällig/der direkte Weg in die Hölle unter 64-Bit. |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Hallo,
hat den hMod einen anständigen Wert? |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Ein Callback wäre zu spät. Ich muss diesen Aufruf so früh wie möglich machen - am besten bevor irgendwer/irgendwas Speicher über den MemoryManager reserviert. Deswegen ist das die erste Unit in meinen uses in der DLL und deswegen definiere ich GetProcAddress etc selbst um möglichst keine Abhängigkeiten zu haben, die vor meiner Unit initialisiert werden.
@hoika: Ja, wie ich schon in meinem Ausgangspost geschrieben habe, hat hMod einen gültigen Wert ($400000). |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Hallo
Zitat:
Du versuchst das beim laden der Dll zu lösen. Dein Code wird also in der DLL-Main ausgeführt. Aus der MSDN: ![]() Zitat:
Ansonsten bist Du immer abhaängig vom DLL-Loader und da hast Du keinerlei Einfluss |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Das habe ich gelesen, aber ich benutze weder LoadLibrary noch LoadLibraryEx.
|
AW: Exportierte Funktion aus Exe mit GetProcAddress
Tja, für mich fällt das in die selbe Gruppe.
Du hast keinerlei Einfluss auf den LadeProcess. Deine Dll ist in der DLLMain. Möglicherweise kannst Du es irgendwie umgehen im Moment. Beim nächsten Windows - Update kommt eine Änderung von Microsoft und peng...... Kannst Du uns mal erleuchten was Du eigentlich erreichen willst? |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein kleiner Test
eigentlich müsste 2 mal eine messagebox kommen. Schau es Dir mal im Debugger an..... |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Habs hinbekommen.
Auch wenn das in der Windows Unit auf den ersten Blick so aussieht:
Delphi-Quellcode:
GetProcAddress gibt es (original) nicht im WideString-Format:
// Winapi.Windows
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; overload; function GetProcAddress(hModule: HMODULE; lpProcName: LPCWSTR): FARPROC; stdcall; overload;
Delphi-Quellcode:
Musste also meine eigene Definition von PChar auf PAnsiChar ändern und jetzt klappt es.
// Winapi.Windows
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; external kernel32 name 'GetProcAddress'; function GetProcAddress(hModule: HMODULE; lpProcName: LPCWSTR): FARPROC; begin if ULONG_PTR(lpProcName) shr 16 = 0 then // IS_INTRESOURCE Result := GetProcAddress(hModule, LPCSTR(lpProcName)) else Result := GetProcAddress(hModule, LPCSTR(TMarshal.AsAnsi(lpProcName))); end; |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Du solltest darauf achten, dass eine .reloc Section für deine .exe generiert wird, sonst bekommst du Probleme, wenn Adresse 00400000 schon belegt ist.
|
AW: Exportierte Funktion aus Exe mit GetProcAddress
Wieso? Ich gehe doch nicht hartkodiert auf $400000.
GetModuleHandle(nil) sollte mir doch die Basisadresse der exe liefern egal wo sie liegt oder nicht? |
AW: Exportierte Funktion aus Exe mit GetProcAddress
Achso nevermind, du lädst die .exe ja gar nicht selbst. Passt schon :P
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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