![]() |
DLL aus Resource direkt aus dem Speicher laden und benutzen!
Hallo,
da ich wirklich lange danach gesucht habe und immer nur übermäßig langen, für mich unverständlichen Code stoß, hier mal eine Lösung: Wie binde ich eine DLL als Resource ein?
Nun zum eigentlichen Threadthema, wie kann ich diese DLL nun aufrufen, ohne sie vorher auf dem Dateisystem zu droppen, also direkt aus dem Speicher laden? Um die Datei aus den Resourcen zu laden:
Delphi-Quellcode:
var
ms : TMemoryStream; rs : TResourceStream; begin if 0 <> FindResource(hInstance, 'DllDatei', RT_RCDATA) then begin rs := TResourceStream.Create(hInstance, 'DllDatei', RT_RCDATA); ms := TMemoryStream.Create; try ms.LoadFromStream(rs); ms.Position := 0; m_DllDataSize := ms.Size; mp_DllData := GetMemory(m_DllDataSize); ms.Read(mp_DllData^, m_DllDataSize); finally ms.Free; rs.Free; end; end; end; Nun ist die DLL in den Speicher geladen! So benutzt man die DLL nun:
Delphi-Quellcode:
Ich hoffe für den ein oder anderen war das eine Hilfe!
var
btMM: PBTMemoryModule; begin btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize); try if btMM = nil then Abort; @m_TestCallstd := BTMemoryGetProcAddress(btMM, 'TestCallstd'); if @m_TestCallstd = nil then Abort; m_TestCallstd('Das ist ein DLL-Speicher Aufruf!'); except Showmessage(Ein Fehler ist enstanden bei Aufruf der DLL : ' + BTMemoryGetLastError); end; if Assigned(btMM) then BTMemoryFreeLibrary(btMM); end; Quelle: ![]() Download .PAS: ![]() |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
seltsam, eigentlich habe ich eine Antwort geschrieben, aber sie taucht nicht auf
|
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
sorry, aber das kann ja nicht die Lösung sein
Editor öffnen und "<DemoNameAufruf> RCDATA <DemoDatei.dll>" hineinschreiben. Bsp.: DllDatei RCDATA MeineDll.dll Diese Datei als .RC-Datei speichern. (Bsp.: Resources.RC) CMD öffnen (Start->Ausführen->cmd.exe->Return) und in das Verzeichnis der .RC-Datei navigieren. In die Konsole eintippen: BRCC32 <rcDatei.RC> Bsp.: BRCC32 Resources.RC Nun sollte eine .RES-Datei im gleichen Verzeichnis entstanden sein. In einer Unit nun noch "{$R *.DFM} {$R <resourcename>.RES}" eintragen (Bsp.: {$R *.DFM} {$R Resources.RES}) und fertig. Bitte trage diese Compiler-Direktive nach der From direktive und vor dem Implementation Schlüsselwort ein. ich bin mir sicher, dass Delphi diese Möglichkeit bietet |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
Zitat:
In der Zeit in der du hier auf eine Antwort wartest, hättest du das schon 10x erledigen können. |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
Zitat:
Allerdings kann man sich ein Script schreiben oder ein Tool was das automatisch beim compilieren macht. Ich erzeuge zum Beispiel dll's die nach ihrem compilieren einmal aufgerufen um einen Schlüssel für sich selber zu erstellen dann könnte die sich aber selber in eine resource packen. Aber ich würde die Dll eh nicht als resource einbinden sondern auf irgend eine andere art hugepack nehmen. ZB. als konstante Daten oder in einer DB die alle Ressourcen des Projektes bündelt. Aber, herzlichen Dank für das Tutorial. |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
"u_dzDllLoader/ResourceDllLoader allow to access DLLs functions in a object oriented manner, the latter provides loading a DLL from the program’s resources rather than from disk (which is a hack, so beware that it might not work on the latest and greatest Windows version)"
![]() Es funktioniert definitiv noch im aktuellen Windows 10 64 Bit. Aber nur für 32-Bit Programme und DLLs. |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
Hallo,
Zitat:
Diese RC in das Projekt einbinden, dann baut Delphi die RES bei jedem Compilieren selber zusammen. Dank Make wird die RES nur neu erzeugt, wenn sich die Daten der RC ändern, hoffe ich. |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
offensichtlich versteht niemand so richtig, worum es geht ... wahrscheinlich habe ich es nicht genau genug beschrieben.
also nochmal ganz langsam: ich schreibe ein Programm, mit dem ich auf eine MySQL-Datenbank zugreifen will. Die Datenbank ist dabei eigentlich völlig egal - ich sag's nur. deshalb lege ich eine Komponente vom Typ TFDConnection an in dieser wähle ich die DriverID MySQL von diesem Moment an will Delphi beim Compilieren eine DLL im Pfad finden aus welchen Gründen auch immer ist scheinbar nur "libmariadb.dll" geeignet ... kann mir auch egal sein ich rufe keine Funktion aus dieser DLL direkt auf, sondern nutze ausschließlich Delphi-Komponenten. die Frage lautet nun: kann ich Delphi irgendwie mitteilen, dass die DLL direkt geladen und quasi in der EXE mitgenommen wird oder nicht? das ausschließliche Ziel lautet: kann ich die EXE-Datei auf einen anderen Rechner übertragen, ohne die zusätzliche DLL auch mitzunehmen? |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
Aha, das klingt doch schon anders.
Einfach die benötigten DLLs, z.B. libmariadb.dll, als Resource mit in deine EXE packen und beim Start und vor der Verbindung mit der Datenbank aus der Resource rausholen und irgendwo temporär hinspeichern, wo dein Programm Schreibrechte hat (bspw. %APPDATA%). Dann ziehst du dir noch eine Instanz von TFDPhysMySQLDriverLink auf das Formular (oder erzeugst es zur Laufzeit - je nachdem wie du deine TFDConnection behandelst.) und gibst über die Property VendorLib den Pfad zur deiner temporär abgespeicherten DLL an. ![]() |
AW: DLL aus Resource direkt aus dem Speicher laden und benutzen!
Eine ähnliche Lösung wurde vor langer Zeit im Forum "Delphi-Treff" veröffentlicht:
![]() Gruß, Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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