Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#21

AW: hh.exe standardmäßig auf allen Windows-Computern vorhanden?

  Alt 9. Apr 2016, 11:36
Also ich würd' das Formular des Programmes einfach in mein Programm mit aufnehmen, Visible auf false setzten und die Methode 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 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;
  Mit Zitat antworten Zitat