Announcement

Collapse
No announcement yet.

An Alle Profis, GANZ DRINGEND!!! BITTE

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

  • An Alle Profis, GANZ DRINGEND!!! BITTE

    Ich habe ca 30 RTF Dateien in einer Ressource gespeichert, die einzelnen Dateien kann ich auch in einer Richtext ausgeben.

    Das Problem ist nur daß ich weit über 100 dateien in Ressourcen speichern müßte und meine Anwenung jetzt schon 700kb hat. Jetzt meine Frage. Wie kann ich die RTF Dateien in eine DLL speichern, wie kann ich die Namen der rtf Dateien aus der DLL in einer Listbox anzeigen lassen und wie kann ich bei onklick auf die Listrbox die jeweilige RTF in einer Richtext anzeigen lassen? Bitte helft mir am besten mit Source, sonnst lerne ich es nie.

    Danke

  • #2
    Hallo,

    es ist doch egal, ob die Ressourcen in der EXE oder in der DLL abgelegt werden, der Platzverbrauch auf der Festplatte ist der Gleiche. Die Ressourcen werden beim Start der EXE nicht automatisch geladen, so dass auch der Platzbedarf im Arbeitsspeicher gleich ist - das Auslagern in eine DLL hätte also auch hier keinen Vorteil. Der einzige Vorteil einer DLL liegt im einfacheren Austausch, da die EXE beim Ändern der RTF-Text nicht mit ausgetauscht werden muss.

    Der Zugriff auf Ressourcen aus einer DLL könnte so aussehen:
    <pre>
    ...
    hDLL := LoadLibrary('DBDATA');
    if hDLL <> 0 then begin
    aRS := TResourceStream.Create(hDLL, aSource, 'DBDATA');
    ...
    end;
    </pre&gt

    Comment


    • #3
      Ich will die Dateien in eine DLL schreiben, weil ich dann die jeweils nötige erst laden brauche wenn ich sie brauche. Das währe auch besser, wenn ich updates für mein Prog erstellen will. Es geht mir nicht um den Platz auf der Festplatte sondern um die Größe der exe des Hauptprogramms. Ihr Beispiel zeigt den Zugriff auf eine Ressource in einer DLL. Wie kann ich aber die RTF Dateien in die DLL einbinden und wie kann ich vom Hauptprogramm aus auf die einzelnen Dateien in der DLL zugreifen? Bitte etwas ausführlicher am besten mit source :-) Dank

      Comment


      • #4
        Hallo,

        Win32 lädt beim Aufruf nur den ausführbaren Programmcode einer EXE (aber nicht den Ressourcenteil) in den Arbeitsspeicher. Somit wird kein RAM vergeudet.

        Es gibt keinen Unterschied zwischen dem Einbinden der RES-Datei in eine EXE und eine DLL. Wie sieht denn die bisherige Vorgehensweise aus, wenn die RTF-Datei in der EXE als Ressourcen (*.RES) angehängt werden

        Comment


        • #5
          <pre>Ich habe die RTF - Dateien so in die Ressource geschrieben<BR>

          <font color="#800000">1 BINRES &quot;den Fokus auf das nächste Steuerelement wechseln.rtf&quot;
          2 BINRES &quot;den Monitor abstellen.rtf&quot;
          3 BINRES &quot;die Titelleiste ausblenden.rtf&quot;
          </font>
          Die Ressource habe ich so in die DLL eingebunden<BR>

          <font color="#800000">library sys_dll;
          uses
          SysUtils;
          {$R BINRES_SYS.RES}
          begin
          end.
          </font><BR>
          Im Hauptprogramm will ich nun das alle namen der RTF Dateien in einer Listbox angezeigt werden.
          Wenn ich in der Listbox auf den Namen klicke, soll die passende RTF in einer Richedit angezeigt
          werden.
          Das will ich deshalb über DLLS machen, weil es verschiedene Themen gibt die immer so an die
          40 RTF Dateien enthalten. Außerdem will ich es mit DLLs machen, das ich das Programm leichter
          mit weiteren Dateien (RTF) erweitern kann. Die DLLs bracuhe ich auch für andere Programme.<BR>

          <u><b>Die Fraqe jetzt noch mal,</b></u> <BR>
          Wie kann ich alle RTF Dateien aus der DLL in einer LIstbox anzeigen lassen
          Wie Kann ich bei klick auf den Namen der RTF diese in einer Richedit anzeigen lassen</pre&gt

          Comment


          • #6
            Hallo,

            da es sich um ganz normale Ressourcen handelt, die über RES-Dateien eingebunden werden, kann man das übernehmen, was Borland in dem Delphi-Beispielprojekt <b>Resxplor</b> demonstriert. Bei diesem Programm (<i>C:\Programme\Borland\Delphi5\Demos\Resxplor</i>) kann eine EXE oder DLL ausgewählt werden, wobei das Programm alle vorgefundenen Ressourcen in einem TTreeView auflistet. Wird ein konkreter Eintrag aus dem TreeView ausgewählt, so zeigt der Resxplor den Inhalt an. Für ein vollständiges Listing reicht der Platz nicht, daher beschränke ich mich auf den wesentlichen Teil:
            <pre>
            function TExeImage.GetResourceList: TResourceList;
            var
            ResSectHdr: PIMAGE_SECTION_HEADER;
            begin
            if not Assigned(FResourceList) then
            begin
            if GetSectionHdr('.rsrc', ResSectHdr) then
            begin
            FResourceBase := ResSectHdr.PointerToRawData + LongWord(FDosHeader);
            FResourceRVA := ResSectHdr.VirtualAddress;
            FResourceList := TResourceList.CreateList(Self, FResourceBase, Self);
            end
            else
            ExeError('No resources in this file.');
            end;
            Result := FResourceList;
            end;
            </pre&gt

            Comment


            • #7
              Ich komme mit diesem Beispiel einfach nicht zu recht.
              Ich will doch nur Binres auslesen und zwar in eine richedit. Das kann doch nicht so viel source sein

              Comment


              • #8
                Hi

                Dein BINRES sollte geändert werden da dies Resourcen vom Typ RC_DATA erzeugt. Besser wäre einen eigenen Resourcentyp zu nutzen, z.B. 'RTF'.

                im program kannst Du dann über alle diese 'RTF' resource iterieren mit:

                <pre>

                function GetRTFNames(const FileName: String; List: TStrings): Boolean;<br>

                function RTFEnum(Module: hModule; ResType, ResName: PChar; List: TStrings): Bool; stdcall;
                begin
                Result := True;
                if DWord(ResName) and $FFFF0000 <> 0 then
                List.Add(ResName);
                end;<br>

                var
                DLL: hModule;
                begin
                Result := False;
                List.BeginUpdate;
                try
                List.Clear;
                DLL := LoadLibraryEx(PChar(Filename), LOAD_LIBRARY_AS_DATAFILE);
                if DLL <> 0 then
                try
                EnumResourceNames(DLL, 'RTF', @RTFEnum, DWord(List));
                Result := True;
                finally
                FreeLibrary(DLL);
                end;
                finally
                List.EndUpdate;
                end;
                end;<br>

                </pre>

                Gruß Hage

                Comment


                • #9
                  <p>Das wird ja immer schlimmer, Danke erst mal für die Antwort. <br>
                  Leider hat mich diese noch mehr verwirrt.<br>
                  <br>
                  Kannst du mir bitte anhand meines Beispiels den Source anpassen?<br>
                  Ich habe die Ressource geändert und in die Sys_dll.dll eingebunden.<br>
                  <br>
                  Wo soll ich jetzt deinen Code ins Hauptprogramm einfügen?<br>
                  Ich habe ihn im implementationsteil eingefügt </p>
                  <p>An der unterstrichenen blauen Stelle kommt die Fehlermeldung [Error]
                  Unit1.pas(37): Not enough actual parameters <br>
                  Wie genau muß ich das ganze nun in mein Hauptprogramm einbinden damt es endlich
                  funktioniert. oder muß ich in der DLL auch noch etwas wie eine funktion
                  einfügen?</p>
                  <p>&nbsp;</p>
                  <pre>function GetRTFNames(const FileName: String; List: TStrings): Boolean;</pre>
                  <pre> function RTFEnum(Module: hModule; ResType, ResName: PChar; List: TStrings): Bool; stdcall;
                  begin
                  Result := True;
                  if DWord(ResName) and $FFFF0000 &lt;&gt; 0 then
                  List.Add(ResName);
                  end;
                  </pre>
                  <pre>var
                  DLL: hModule;
                  begin
                  Result := False;
                  List.BeginUpdate;
                  try
                  List.Clear;
                  DLL := LoadLibraryEx(PChar('<b><font color="#FF0000">sys_dll.dll'</font></b>), <font color="#000080"><u>LOAD_LIBRARY_AS_DATAFILE);</u></font>
                  if DLL &lt;&gt; 0 then
                  try
                  EnumResourceNames(DLL, 'RTF', @RTFEnum, DWord(List));
                  Result := True;
                  finally
                  FreeLibrary(DLL);
                  end;
                  finally
                  List.EndUpdate;
                  end;
                  end;
                  </pre&gt

                  Comment


                  • #10
                    Hi

                    also Leute, ihr stellt euch an. Wenn Du mal in der Windows-API Hilfe nachgeschaut hättest müsstest Du bemerkt haben das mir ein Fehler unterlaufen ist. Wie der Compiler zu recht bemerkte fehlt ein Paramter, nämlich eine 0 für das hFile.

                    <pre>

                    HINSTANCE LoadLibraryEx(

                    LPCTSTR lpLibFileName, // points to name of executable module
                    HANDLE hFile, // reserved, must be NULL
                    DWORD dwFlags // entry-point execution flag
                    );

                    </pre>

                    Gruß Hagen

                    PS: Zur Entschuldigung, den code habe ich direkt eingehämmert und ich schau nicht jedesmal nach bzw. teste den mist für euch

                    Comment


                    • #11
                      Vielen Dank, aber ich habe in der Hilfe nachgeschaut und ich habe auch als letzten Parameter eine 0 angegeben. Trotzdem wird in meiner Richedit nichts angezeig

                      Comment


                      • #12
                        Hi

                        Sieh unter http://www.entwickler-forum.de\webx?11@@.ee85355

                        Gruß Hage

                        Comment


                        • #13
                          <PRE>
                          unit misc;

                          interface
                          function ResourceExport(FResourceNamechar;FResourceCategorychar;FExportFileName:String;FOverwrite:boolean):Bo olean;

                          implementation

                          uses
                          Sysutils, Windows, classes, mmsystem;

                          const
                          reNotFound = 1 ;
                          reLoadError = 2 ;
                          reFileExists = 4 ;

                          function ResourceExport(FResourceNamechar;FResourceCategorychar;FExportFileName:String;FOverwrite:boolean):Bo olean;
                          var
                          Res, ResHandle : THandle ;
                          P : ^Char ;
                          N : integer ;
                          FS : TFileStream ;
                          begin
                          Res := FindResource (HInstance,PChar (FResourceName),PChar(FResourceCategory)) ;
                          if res <> 0 then begin
                          ResHandle := LoadResource (HInstance,Res) ;
                          if ResHandle <> 0 then begin
                          N := SizeOfResource (HInstance,res) ;
                          P := lockresource (ResHandle) ;
                          if not(FileExists (FExportFileName)) or FOverwrite then begin
                          DeleteFile (Pchar(FExportFileName)) ;
                          FS := TFileStream.Create (FExportFileName,fmCreate) ;
                          FS.Write (P^,N) ;
                          FS.Free ;
                          UnLockResource (resHandle) ;
                          FreeResource (resHandle) ;
                          Result := True ;
                          end else begin
                          Result := False ;
                          end ;
                          end else begin
                          Result := False ;
                          end ;
                          end else begin
                          Result := False ;
                          end ;
                          end;

                          end.

                          </PRE>

                          bei ner .exe hats gefunzt nur dll, ka. vielleicht als idee aber was wert .

                          Comment

                          Working...
                          X