AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials DLL aus Resource direkt aus dem Speicher laden und benutzen!

DLL aus Resource direkt aus dem Speicher laden und benutzen!

Ein Tutorial von Lyan · begonnen am 1. Okt 2012 · letzter Beitrag vom 29. Apr 2020
Antwort Antwort
Seite 2 von 2     12
Lyan
Registriert seit: 5. Aug 2011
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?
  1. Editor öffnen und "<DemoNameAufruf> RCDATA <DemoDatei.dll>" hineinschreiben.
    Bsp.: DllDatei RCDATA MeineDll.dll
  2. Diese Datei als .RC-Datei speichern. (Bsp.: Resources.RC)
  3. CMD öffnen (Start->Ausführen->cmd.exe->Return) und in das Verzeichnis der .RC-Datei navigieren.
  4. In die Konsole eintippen: BRCC32 <rcDatei.RC>
    Bsp.: BRCC32 Resources.RC
  5. Nun sollte eine .RES-Datei im gleichen Verzeichnis entstanden sein.
  6. 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.

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:
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;
Ich hoffe für den ein oder anderen war das eine Hilfe!


Quelle: http://delphi.about.com/od/windowssh...nto-memory.htm
Download .PAS: https://github.com/jasonpenny/democo...ter/dGinaTest/

Geändert von Lyan ( 1. Okt 2012 um 14:36 Uhr)
 
globetrotter77

 
Delphi 10.3 Rio
 
#11
  Alt 29. Apr 2020, 11:57
genau das will ich vermeiden, ich will keine zusätzlichen Dateien benutzen ... ich will einfach potentiellen Kunden genau eine Datei namens humpfliwumpf.exe in die Hand drücken, evtl. auch auf nem Stick, und der Kunde soll dann diese humpfliwumpf.exe mit Doppelklick aufrufen können, ohne auch nur zu wissen, dass er mit MySQL arbeitet und dass das Programm Daten aus einer MySQL-DB im Internet abruft.

Wenn ich zusätzliche Dateien verwenden wollte, wäre das Problem schon längst gelöst ... einfach
libmariadb.dll in den Pfad legen, und gut ist's.

Dem Empfänger will ich das nicht zumuten.
Also wie packe ich libmariadb.dll als Resource mit in meine EXE?
wahrscheinlich völlig trivial
  Mit Zitat antworten Zitat
DieDolly
 
#12
  Alt 29. Apr 2020, 12:53
Zitat:
Warum sollte man das nur einmal erledigen müssen? Das muss man immer wieder machen wenn sich die Dll geändert hat.
Sowas schreibt man in eine BAT-Datei und klickt die dann doppelt an. Ob das wirklich so viel Arbeit ist?
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz