Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern? (https://www.delphipraxis.net/154689-wie-kann-man-dateien-von-einer-dll-datei-hollen-und-auf-hd-speichern.html)

thomas2009 21. Sep 2010 14:12

Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Hallo
ich habe mehrere Dateien in eine dll gespeichert. Wie kann ich diese wieder von dll auf die Festplatte speichern. Allerdings die Namen meiner Dateien weiß ich natürlich
Meine Dateien heißen :test01.mp3 bis test11.mp3

Luckie 21. Sep 2010 14:19

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
was verstehst du unter "in DLL gespeichert"? Wie sind denn die Dateien in der DLL drin? Als Ressourcen? Dann einfach mit meinem ResourceStream.

thomas2009 21. Sep 2010 16:54

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
meinedaten.RC :
video1.mp3 23 "video1.mp3"

Delphi-Quellcode:
implementation

{$R *.dfm}
{$R meinedaten.RES}

procedure TForm1.Button1Click(Sender: TObject);
var myRes : TResourceStream;
begin

myRes:=TResourceStream.Create(Hinstance,'video1.mp3','23');
myRes.SaveToFile('video1.mp3');
myRes.free;

end;
Fehler : video1.mp3 nicht gefunden

himitsu 21. Sep 2010 17:04

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Hinstance = Handle des aktuellen Moduls, also in diesem Fall von der EXE.
Du brauchst hier natürlich das Handle der DLL :zwinker:

Delphi-Referenz durchsuchenLoadLibrary


Was soll denn 23 für ein ResType sein?

PS: 23 <> '23'

thomas2009 21. Sep 2010 17:35

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Die Ressourcen sind sowohl in .Res als auch in einer .dll Datei

Ich möchte mit meinem Code zuerst versuchen die Dateien aus Ressource zu holen.

himitsu 21. Sep 2010 18:13

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Versuch es mal mit RCDATA (in der RES) und RT_RCDATA im Programm.

thomas2009 21. Sep 2010 19:29

AW: Wie kann man Dateien von einer Res / DLL Datei hollen und auf HD speichern?
 
Die RC kann ich leider nicht ändern
test1.mp3 23 "test1.mp3"
So ist in .Res gespeichert leider

lbccaleb 21. Sep 2010 21:31

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Ähh entschuldige die Frage, aber wei´t du ungefähr was du da überhaupt machst?

thomas2009 21. Sep 2010 23:21

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Das Problem liegt nur an .RC Datei
die Datei .rc wurde leider in diesem Form erstellt :
resource.rc :
test1.mp3 23 test1.mp3

wenn aber die resource so wäre :
test1.mp3 RCDATA test1.mp3

dann ist kein Problem die Dateien von rers zu holen :
Delphi-Quellcode:
var
   RS: TResourceStream;
begin
   RS := TResourceStream.Create(0, 'test1.mp3', RT_RCDATA);
   RS.SaveToFile('test1.mp3');
   RS.Free();
und so geht ohne Probleme
aber leider ist die .rc statt RCDATA, 23 erstellt
23 gilt algemeine für HTML files

Ich erhalte immer diese Fehlermeldung : test1.mp3 nicht gefunden
ich habe versucht auch mit dem code :
Delphi-Quellcode:
RS := TResourceStream.Create(0, Pchar('test1.mp3'), Pchar('23'));

sx2008 22. Sep 2010 02:15

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Microsoft hat ein etwas seltsames System um Resource Typen zu kennzeichnen.
Hier die Übersicht.
Einerseits ist der Resourcetyp eine Zahl, andererseits wird er über einen PCHAR übergeben.
Die Idee dahinter ist wohl, dass man die API so offen halten wollte, dass
man in Zukunft neben den Zahlenwerten auch Strings übergeben kann.
Das Makro MAKEINTRESOURCEA erledigt für C-Compiler den Trick:
Code:
#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
Daher:
Delphi-Quellcode:
const
  _RT_HTML = 23; // bitte prüfen, ob RT_HTML nicht schon in Unit Windows definiert wurde
...
RS := TResourceStream.Create(0, Pchar('manual.html'), MAKEINTRESOURCE(_RT_HTML));
Es ist natürlich eine Verletzung der Konventionen,
wenn hinter der Resource RT_HTML ein MP3-Video abgelegt wird.
Das sollte man nicht tun.
Richtig wäre hier der Typ RT_RCDATA.

thomas2009 30. Sep 2010 22:58

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Zurück zu dem Thema Leute

ich habe mehrere Dateien in eine .dll als Ressource gespeichert. Wie kann ich diese wieder von dll auf die Festplatte speichern. Allerdings die Namen meiner Dateien weiß ich natürlich

dll Datei heisst : meineDll.dll
Datei-Name in Ressource :
test01.mp3 RT_RCDATA test11.mp3

Wie hole ich die Datei test1.mp3 aus der datei meineDll.dll und speichere ich auf die Festplatte ?

Luckie 30. Sep 2010 23:14

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var myRes : TResourceStream;
begin

myRes:=TResourceStream.Create(Hinstance,'video1.mp3','23');
myRes.SaveToFile('video1.mp3');
myRes.free;

end;
HInstance muss natürlich das Handle der DLL sein, d.h. du musst vorher mit LoadLibrary die DLL laden.

Luckie 1. Okt 2010 00:18

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Damit das hier mal ein Ende hat.

Ressourcenskript:
Code:
Anne RCDATA Anne.jpg
DLL:
Delphi-Quellcode:
library ResDLL;

{$R resource.res}

begin
end.
Exe:
Delphi-Quellcode:
procedure ExtractResFromDLL(DLLName: String; ResName: String; Filename: String; ResType: PChar);
var
  dll: THandle;
  ResStream: TResourceStream;
begin
  dll := LoadLibraryEx(PChar(DLLName), 0, LOAD_LIBRARY_AS_DATAFILE);
  if dll <> 0 then
  begin
    ResStream := TResourceStream.Create(dll, ResName, RT_RCDATA);
    try
      try
        ResStream.SaveToFile(Filename);
      except
        on E: Exception do
          raise Exception.Create(E.Message);
      end;
    finally
      ResStream.Free;
    end;
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    ExtractResFromDLL(ExtractFilePath(ParamStr(0)) + 'ResDLL.dll', 'Anne', ExtractFilePath(ParamStr(0)) + 'Anne.jpg', RT_RCDATA);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
Und das ganze noch mal als lauffähige Demo im Anhang.

thomas2009 1. Okt 2010 00:51

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Danke @Luckie für Deine Mühe
es hat geklappt :)

Luckie 1. Okt 2010 00:53

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Woran hat es gelegen? Und nimmst du jetzt meine Funktion?

thomas2009 10. Okt 2010 20:50

AW: Wie kann man Dateien von einer DLL Datei hollen und auf HD speichern?
 
Mit Deiner Funktion hat es geklappt natürlich :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 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-2025 by Thomas Breitkreuz