Announcement

Collapse
No announcement yet.

TResourceStream bzw. TFileStream Problem!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TResourceStream bzw. TFileStream Problem!

    Hi,

    ich benutze TResourceStream und andere EXE Dateien Wave oder ähnliches in einem Stream zu packen und dies in meinem Delphi5 Programm einzubinden.
    Aber ich will nicht das die Resourcen Datei in meinem Programm compiliert wird sondern in einer zweiten Datei bleibt (z.B. Resource.dat) und mein Programm bei Bedarf diese Resourcen Dateo öffnet und ließt und den Inhalt wie mit TResource Stream auch auf der Festplatte speichern kann.

    Ich habe schon TFileStream ausprobiert aber ich weiß nicht wie das damit geht oder wie ich es mit TResourceStream machen soll.

    Bitte DRINGEND um Hilfe! Bitt mit Beispielcode.
    Big Thanks

    Hendrik

  • #2
    Hallo,

    normalerweise verwendet man in diesem Fall eine DLL, die nur aus den Ressourcen besteht. Das hat den Vorteil, dass zum Ausslesen der Daten genau die gleichen Funktionen wie bei der EXE verwendet werden können (abgesehen vom Modul-Handle). Das folgende Beispielprojekt (Auslagern von WAVE-Ressourcen in eine Ressourcen-DLL) stammt aus meinem Buch <i>Delphi Win32-Lösungen</i>:

    <b>DLL-Projektdatei</b>
    <pre>
    library WaveDLL;

    uses
    SysUtils;

    {$R DLGOPEN.RES}
    {$R DLGCLOSE.RES}
    {$R NEXTREC.RES}

    begin
    end.
    </pre>
    <b>Anwendungsprogramm</b> <br>
    (auch dieses Beispiel stammt aus dem o.g. Buch)
    <pre>
    uses MMSystem;

    procedure TFormMain.BitBtnPlayClick(Sender: TObject);
    begin
    hDLL := LoadLibrary('WAVEDLL.DLL');
    if hDLL <> 0 then begin
    PlaySound('DLGOPEN', hDLL, SND_SYNC or
    SND_RESOURCE or SND_NODEFAULT);
    FreeLibrary(hDLL);
    end;
    StatBar.SimpleText := 'WAVE-Sound aus der DLL'
    end;
    </pre>

    <b>Beispiel für das Abspeichern von RCDATA-Ressourcen als Datei</b>
    <pre>
    procedure TFormMain.ButtonStartClick(Sender: TObject);
    begin
    ButtonStart.Enabled := False;
    // DLL mit den Datenbanktabellen als Ressource laden
    hDLL := LoadLibrary('DBDATA');
    if hDLL <> 0 then begin
    StatBar.SimpleText := 'Tabellen werden kopiert ...';
    Refresh;
    WriteResDBDATAToFile('telnrdb','telnr.db');
    WriteResDBDATAToFile('telnrpx','telnr.px');
    WriteResDBDATAToFile('telnrval','telnr.val');
    WriteResDBDATAToFile('datendb','daten.db');
    WriteResDBDATAToFile('datenpx','daten.px');
    WriteResDBDATAToFile('datenval','daten.val');
    ButtonStart.Enabled := True;
    StatBar.SimpleText := 'Tabellen wurden angelegt';
    FreeLibrary(hDLL);
    end
    else StatBar.SimpleText := 'DLL konnte nicht geladen werden!';
    end;

    procedure TFormMain.WriteResDBDATAToFile(aSource, aTarget: String);
    var
    aRS : TResourceStream;
    begin
    aRS := TResourceStream.Create(hDLL, aSource, 'DBDATA');
    try
    aRS.SaveToFile(aTarget);
    finally
    aRS.Free;
    end
    end;
    </pre>
    &#10

    Comment


    • #3
      Thx,

      aber ich habe dazu noch eine Frage...
      Warúm heißt die DLL Datei DBDATA und nicht DBDATA.DLL ???
      Ist das nur so als beispiel oder wie war das gedacht?

      Und wozu sind eigentlich diese Handles gut? Ich habe die noch nie benutzt.

      Thx for help!

      MfG Hendri

      Comment


      • #4
        PS: Eine etwas sinnvollere Frage...

        Wie kann ich ein kleines Programm entwickeln das
        mir eine solche DLL datei wie du sie oben gezeigt hast erstellen kann, ohne dass ich immer in Delphi gehen muss?

        Geht das vielleicht irgendwie mit diesem BRCC32 oder wie das heißt womit man resourcen dateien compiliert??? Und wenn wie?

        Thx!

        Hendrik

        (So sah in etwa die DLL datei aus)

        library sampledll;
        uses SysUtils;
        {$R resource.res}
        begin
        end

        Comment


        • #5
          Hallo,

          die Handels werden zur Umsetzung des "<I>Sandwich-Prinzips</i>" benötigt: <br>
          1. Schritt: Ressourcen anfordern (LoadLibrary) <br>
          2. Schritt: Ressourcen prüfen und verwenden <br>
          3. Schritt: Ressourcen freigeben (FreeLibrary)<br>
          (Sandwich = 2 Scheiben mit etwas "Belag" dazwischen)

          Je nach Windows-Version muss beim Laden einer DLL die Dateiendung nicht mit angegeben werden, das Beispiel demonstriert somit nur meine Faulheit :-)

          zur Frage BRCC32.EXE: <br>
          Delphi 5 erledigt alle notwendigen Zwischenschritte (Compilieren der RC-Datei in eine RES-Datei und einbinden in die DLL-Ressourcen) automatisch (wenn die RC-Datei mit in die Projektgruppe eingebunden wird), somit muss man nicht mehr mit dem Ressourcen-Compilier hantieren. Alle diese Schritte können auch über die Kommandozeilen-Tools aus dem Bin-Verzeichnis von Delphi abgearbeitet werden, wobei dies jedoch in den meisten Fällen keinen Sinn macht (mehr Aufwand als in der IDE). Da diese Kommandozeilen-Tools auch nicht an Dritte weitergegeben werden dürfen, wird beim Einsatz in jedem Fall Delphi benötigt

          Comment


          • #6
            Hi,

            vielen Dank für die Hilfe! Jetzt habe ich ja doch noch Chancen delphi zu lernen
            Dein Beispiel mit dem Resourcen hat geklaptt (nachdem ich einen Fehler ausbügeln musste den du wahrscheinlich vergessen hast) Aber so hab ich wenigstens was gelernt. Na ja jedenfalls...

            Ich habe mir mal so ein DLL Delphi Projekt im Notepad angeguckt und es sind ja Textdateien.
            Mich interessiert wie ich mit den Komandozeilen Progs solch eine DLL Unit compilieren kann, (nicht weil ich das Ding weitergeben will) sondern weil ich dann nicht immer Delphi installieren muss um solche DLL Dateien zu compilieren die meine Resourcen enthalten.
            Und ich kann mir ein Programm schreiben das es mir erleichtert Resourcen (mit BRCC32) zu erstellen. (Resourcen weiß ich wie ich die damit machen kann aber nicht DLL.

            Danke für deine Bemühungen!

            Gruß Hendrik

            PS: Bist du zufällig angestellter im Entwickler Forum weil du überall solche Fragen beantwortest. (Ich weiß ist eine Persönliche Frage

            Comment


            • #7
              Hallo,

              wenn man nicht absichtlich gegen die Lizenzbestimmungen verstossen will, kommt man an einem installierten Delphi nicht drumrum. Jede Delphi-Anwendung kann auch ohne IDE compiliert werden, aber das bedeutet nicht, dass man in diesem Fall die Kommandozeilen-Tools auf einen Rechner kopieren darf, auf dem Delphi nicht installiert ist.

              Außerdem reicht es aus, eine leere DLL als "Kopiervorlage" zu verwenden und immer dann, wenn Ressourcen hinzugefügt werden sollen, die folgenden Schritte abzuarbeiten: <br>
              1. DLL unter einem anderen Namen kopieren <br>
              2. Ressourcen als RES-Datei compilieren <br>
              3. RES-Datei in die DLL linken <br>
              Die allesentscheidende Frage ist nun, dass für Schritt 2 und Schritt 3 ein Tool benötigt wird, das verfügbar ist. Dies muss nicht unbedingt BRCC32.EXE sein, da an dieser Stelle jede Entwicklungsumgebung und jede Sprache gleich vorgeht. Falls ein Microsoft-Compiler vor Ort zur Hand ist, reichen dessen Tools auch aus. Oder man schreibt sich seinen Ressourcen-Compiler selbst ;-)

              P.S: Nun zur persönlichen Frage - Nein, ich bin kein Angestellter des Entwickler Forums, sondern wie alle anderen auch nur ein Nutzer dieses Forums (der überwiegend aus Idealismus bei der Sache ist). Allerdings habe ich keine Hemmungen, die hier auftauchenden Fragen und Probleme bei der Themenauswahl meines nächsten Buch-Projekts bzw. in einem Artikel im DER ENTWICKLER zu berücksichtigen ;-

              Comment


              • #8
                Hi,

                schade eigentlich das ich doch immer Delphi installieren muss aber was soll's.
                Was müsste denn das für ein MS Compiler sein??? Oder wie schreibe ich meinen eigenen (der die RES Datei erstellt und in die DLL compiliert) ??? Oder hast du reinzufällig einen Parat? *g*

                MfG

                Hendri

                Comment


                • #9
                  Hallo,

                  bei MS ist <i>Visual Studio</i> dafür zuständig, aber auch diese Entwicklungsumgebung ist nicht umsonst zu haben.

                  Borland stellt im Demos-Verzeichnisbaum von Delphi das Projekt <b>resxplor.dpr</b> zur Verfügung, mit dem schon einmal das Auffinden und Auslesen der Ressourcen demonstriert wird. Wer mehr möchte, muss selber ran ;-

                  Comment


                  • #10
                    Zu P.S: Deine Uploads in den Downloadbereich machst Du aber immer als 'Sysop' oder erscheint das bei allen? ;

                    Comment


                    • #11
                      Hallo,

                      dieser Absender erscheint bei allen, die Uploads machen dürfen ;-

                      Comment

                      Working...
                      X