Einzelnen Beitrag anzeigen

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