AGB  ·  Datenschutz  ·  Impressum  







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

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
 
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#1

DLL aus Resource direkt aus dem Speicher laden und benutzen!

  Alt 1. Okt 2012, 14:16
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)
  Mit Zitat antworten Zitat
 


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 02:37 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