Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi hh.exe standardmäßig auf allen Windows-Computern vorhanden? (https://www.delphipraxis.net/188811-hh-exe-standardmaessig-auf-allen-windows-computern-vorhanden.html)

nahpets 9. Apr 2016 10:36

AW: hh.exe standardmäßig auf allen Windows-Computern vorhanden?
 
Also ich würd' das Formular des Programmes einfach in mein Programm mit aufnehmen, Visible auf false setzten und die Methode
Delphi-Quellcode:
DumpCHMFile('Name der zu entpackenden Datei.chm');
aufrufen.

Anschließend ist der Inhalt im Verzeichnis 'Name der zu entpackenden Datei' zu finden.

Dort kannst Du Dir dann die gewünschten Dateien raussuchen oder halt auch durch den Baum gehen, um dort gezielt zu suchen.
Du findest dort ja bereits alle Informationen, die Du für eine weitere Bearbeitung benötigst.

Bist Du damit fertig, löschst Du noch das für den Export erstellte Verzeichnis.

Letztlich sind die Informationen in 'ner CHM-Datei in 'nem Baum organisiert, ohne den wirst Du nicht auskommen.

Wenn Du den Baum dann Zweig für Zweig durchläufst, kannst Du für jeden Zweig
Delphi-Quellcode:
TreeChange(Self, Node);
aufrufen, also sowas in der Art:
Delphi-Quellcode:
for i := 0 to tree.Items.Count - 1 Do begin
  TreeChange(Self, tree.Items[i]);
end;
Im Attribut Text des Knotens befindet sich der Dateiname, anhand dessen kannst Du entscheiden, ob Du TreeChange für den Zweig überhaupt aufrufen willst.

Ansonsten schau Dir die Methode EnumerateStorage an, dort wird die CHM-Datei letztlich "aufgebröselt".

Mal eine ungetestet hingedaddelte "veränderte" Methode:
Delphi-Quellcode:
procedure TFrmMain.EnumerateStorage(const Storage: IStorage);
var
  Enumerator: IEnumStatStg;
  Stat: TStatStg;
  SubStorage: IStorage;
  Extension: String;
  Src: IStream;
begin
  OleCheck(Storage.EnumElements(0,nil,0,Enumerator));
  while Enumerator.Next(1,Stat,nil) = S_OK do begin
  // Hier ist der Name der Datei / des Verzeichnisses enthalten -> Stat.pwcsName;
    if Stat.dwType = STGTY_STORAGE then begin
      OleCheck(Storage.OpenStorage(Stat.pwcsName,nil, STGM_READ or STGM_SHARE_DENY_WRITE,nil,0,SubStorage));
      EnumerateStorage(SubStorage);
    end else begin
      Extension := UpperCase(ExtractFileExt(Stat.pwcsName));
      if (Extension = '.HTM') or (Extension = '.HTML') then
        // Hier müsstest Du jetzt mal schauen, wo sich genau der Inhalt der HTML-Datei befindet, um ihn dann nach belieben zu verarbeiten.
      OleCheck(SubStorage.OpenStream(Stat.pwcsName,nil,STGM_READ,0,Src));
      // In Src hast Du dann 'nen Stream, den Du (vermutlich) in 'ne TStringList oder sowas laden kannst, für die weitere Verarbeitung.
      end;
    end;
  end;
end;
DumpChmFile könnte dann in etwa so aussehen:
Delphi-Quellcode:
procedure TFrmMain.DumpCHMFile(const Filename: String);
var
  ITStorage: IITStorage;
  S: WideString;
begin
  ITStorage := CoITStorage.Create;
  S := Filename;
  OleCheck(ITStorage.StgOpenStorage(PWideChar(S),nil, STGM_READ or STGM_SHARE_DENY_WRITE,nil,0,FRootStorage));
  EnumerateStorage(FRootStorage);
end;

FarAndBeyond 9. Apr 2016 22:05

AW: hh.exe standardmäßig auf allen Windows-Computern vorhanden?
 
Der SourceCode von FPC kann z.B. hier heruntergeladen werden:
http://www.freepascal.org/down/source/sources.var

Die CHMls.exe ist dort auch zu finden.. also die dazugehörigen Dateien.
Wenn man FPC-SRC entpackt und dann im Verzeichnis "packages\CHM\SRC" nachschaut, dann findet man die Dateien:

..
chmls.lpi
chmls.lpr
chmWriter.pas
chmReader.pas
htmlUtil.pas
..usw...
(insgesamt 23 Dateien)

Ich hab' noch nicht 'reingeschaut, klingt aber schonmal ganz gut...

Wieviel man daran ändern muß um diesen Code in Delphi lauffähig zu machen hab' ich nicht probiert, aber wenn man nur das Dekompilieren benötigt ist es vielleicht ja nicht so doll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr.
Seite 3 von 3     123   

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