Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ResourceDLL aus Speicher laden und direkt verwenden (https://www.delphipraxis.net/170743-resourcedll-aus-speicher-laden-und-direkt-verwenden.html)

Lyan 1. Okt 2012 14:27

Delphi-Version: 7

ResourceDLL aus Speicher laden und direkt verwenden
 
Hallo,

Ich habe eine .RES-file, in welcher ein Bild ist.
Diese .RES-File lade ich in einer DLL. Also ich habe eine DLL, die NUR aus dieser Resource besteht.

Aus dieser DLL habe ich nun wieder eine .RES-Datei erstellt. Diese .RES-Datei möchte ich in den Speicher laden (hat funktioniert) und anschließend das Bild als String einlesen.

Jemand eine Idee?

DeddyH 1. Okt 2012 14:31

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Du hast eine Ressourcen-DLL nochmals als Ressource eingebunden? Soll das nur zum Üben sein, oder welchen Mehrwert versprichst Du Dir gegenüber einer "normalen" Ressource? Ansonsten sollte das doch über LoadFromResourceName zu machen sein, sofern Du an das Instanzenhandle der DLL herankommst, wenn ich nicht irre.

Lyan 1. Okt 2012 14:41

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Zitat:

Zitat von DeddyH (Beitrag 1185275)
Du hast eine Ressourcen-DLL nochmals als Ressource eingebunden? Soll das nur zum Üben sein, oder welchen Mehrwert versprichst Du Dir gegenüber einer "normalen" Ressource? Ansonsten sollte das doch über LoadFromResourceName zu machen sein, sofern Du an das Instanzenhandle der DLL herankommst, wenn ich nicht irre.

Das hat den Sinn, dass ich diese DLL nun direkt aus dem Speicher laden kann.
Ich nehm sie mir aus der Resource, lade sie in den Speicher und rufe ihre funktionen auf.
So muss ich die DLL nicht auf dem Datei-System droppen :)

Die Lösung ist ja klar, nur weiß ich nicht wie ichs in der Praxis umsetze:

Delphi-Quellcode:
library adpResources;

{$R ress.RES}

function FileToStr(sPath:string; var sFile:string):Boolean;
var
hFile: THandle;
dSize: DWORD;
dRead: DWORD;
begin
  Result := FALSE;
  hFile := CreateFile(PChar(sPath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if hFile <> 0 then
  begin
    dSize := GetFileSize(hFile, nil);
    if dSize <> 0 then
    begin
      SetFilePointer(hFile, 0, nil, FILE_BEGIN);
      SetLength(sFile, dSize);
      if ReadFile(hFile, sFile[1], dSize, dRead, nil) then
        Result := TRUE;
      CloseHandle(hFile);
    end;
  end;
end;

<Ab jetzt Pseudo-Code>

function Exporter(Resource : Resourcename) : String; stdcall;
begin

  FileToStr(Resourcename,result);
 
end;

  exports Exporter index 1;

begin

end.
Ich suche nach einer möglichkeit IN meiner Resourcen-DLL auf die resource zuzugreifen^^


EDIT:// Und dass ich resourcen in eine dll einbinde und diese dll dann wieder in eine resource packe hat alles sinn ;)

DeddyH 1. Okt 2012 14:45

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Also ist das doch keine reine Ressourcen-DLL. Allerdings verstehe ich Deinen Code in diesem Zusammenhang nicht, ich denke, Du willst das Bild aus der Ressource der DLL laden und keine Datei?

Lyan 1. Okt 2012 14:50

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Ich habe eine DLL-Datei, in welcher sich ein Bild als Resource befindet.
Diese DLL habe ich wieder in eine Resource gepackt.

In meinem Programm lade ich die DLL aus der Resource direkt in den Speicher. Nun könnte ich ohne die DLL zu droppen, auf die export-Funktionen zugreifen.

Im obigen Beispiel die Funktion "Exporter" die mir einen String zurückgibt.

Diese Funktion "Exporter" soll das Bild, was sich ja als Resource in der DLL selber befindet als String einlesen und mir dann zurückgeben :)

DeddyH 1. Okt 2012 14:53

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Dann versuch es doch einmal mit LoadFromResourceName, um das Bild zu laden, und packe es dann in einen TStringStream. Allerdings könnte es je nach Delphi-Version zu Problemen kommen, wenn Du nicht entweder Sharemem einbindest oder auf PChar ausweichst. Und was passiert, wenn ein Byte des Bildes 0 (Stringendezeichen) ist?

Lyan 1. Okt 2012 14:56

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Zitat:

Zitat von DeddyH (Beitrag 1185284)
Und was passiert, wenn ein Byte des Bildes 0 (Stringendezeichen) ist?

Das Bild wurde vorher Base-64 kodiert.

DeddyH 1. Okt 2012 14:58

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Na dann probier es mal aus. Allerdings bin ich gerade nicht sicher, ob bei einer DLL nun hInstance oder GetModuleHandle der richtige Parameter für LoadFromResourceName ist.

Zacherl 1. Okt 2012 15:17

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Zitat:

Zitat von DeddyH (Beitrag 1185286)
Na dann probier es mal aus. Allerdings bin ich gerade nicht sicher, ob bei einer DLL nun hInstance oder GetModuleHandle der richtige Parameter für LoadFromResourceName ist.

hInstance entspricht immer der eigenen ImageBase. Wenn du LoadFromResourceName also aus der DLL selbst aufrufst, ist hInstance die richtige Wahl. Allerdings könnte es Probleme geben, da der Threadersteller die DLL ja anscheinend mit irgendeinem manual mapping Code in den Speicher läd. Weiß nicht, wie sich die Win API da im Bezug auf Resourcen verhält.

DeddyH 1. Okt 2012 15:22

AW: ResourceDLL aus Speicher laden und direkt verwenden
 
Ich weiß es auch nicht, deshalb sag ich ja: ausprobieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 Uhr.
Seite 1 von 2  1 2      

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