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;