1. Herfried K. Wagner’s VB.Any
  2. Web
  3. Artikel

HTA: Hypertext Application

Kurzfassung

HTA wurde mit dem Internet Explorer 5 von Microsoft eingeführt. Mit HTA wird es ermöglicht, einfache Anwendungen in HTML und JScript bzw. VBScript zu entwickeln, die auch Gebrauch von ActiveX-Komponenten machen können. HTA war eine gute Idee, die jedoch aufgrund von Sicherheitsproblemen kaum den Durchbruch schaffte.

Beschreibung

HTA wurde im Internet Explorer 5 von Microsoft integriert. Ausgesprochen heisst HTAHTML Applicationbzw. besser „Hypertext Application“, es ist also eine HTML-Anwendung. Das kann man sich in etwa wie eine EXE unter Windows vorstellen; bei einem Doppelklick auf die Datei im Explorer öffnet sich ein Programm. Bei HTA verhält es sich ganz ähnlich, nur dass die Datei die Endung .hta hat und vom IE5 abhängig ist.

Eine HTML-Anwendung ist nichts anderes als eine etwas modifizierte HTML-Datei. Wer sich gut mit HTML und am Besten noch mit JScript auskennt, kann mit HTA sehr leicht seine eigenen kleinen Programme schreiben.

Vorteile

Nachteile

Aussehen einer HTA

Beispiel „Hello World“:

<html>
  <head>
  <title>Hello World</title>
  <hta:application
    id="HelloWorld"
    applicationName="HelloWorld"
    border="5pt"
    borderStyle="raised"
    caption="yes"
    maximizeButton="yes"
    minimizeButton="yes"
    showInTaskBar="yes"
    singleInstance="yes"
    sysMenu="yes"
    windowState="maximize"
  >
  </head>
  <body>
  <p>Hello World</p>
  <form>
    <input type="button" onClick="self.close()" value="Anwendung beenden">
  </form>
  </body>
</html>

Wie man unschwer erkennen kann, handelt es sich beim oben angegebenen Code um eine etwas erweiterte HTML-Datei. Die Erweiterung besteht in allen HTA-Dateien nur aus dem <hta:application ...>. Mit self.close() lässt sich in JScript ein Fenster schliessen. Da hier nur ein Fenster offen ist, wird damit die Anwendung beendet.

Attribute

Attribute für das HTA-spezifische Element hta:application (siehe Beispiel in der Einführung):

applicatioName
  • Beschreibung: Setzt den Namen der Anwendung (auszulesen mit JScript).
  • Werte: Zeichenkette
  • Beispiel: applicationName="azApp"
  • Bemerkung: Muss gesetzt werden und eindeutig sein.
  • JScript-Eigenschaft: applicationName
  • Standardwert: —
border
  • Beschreibung: Bestimmt die Rahmenbreite des HTA-Fensters.
  • Werte: thick, dialog window, thin, none
  • Beispiel: border="thin"
  • Bemerkung: Nur gültig für Fenster mit Überschrift und Titel. Der Wert none hat zur Folge, dass die Minimieren- und Maximieren-Buttons, sowie das Programmsymbol nicht angezeigt werden. Steht in Verbindung mit der borderStyle-Eigenschaft, welche die Art des Rahmens festlegt.
  • JScript-Eigenschaft: border
  • Standardwert: thick
borderStyle
  • Beschreibung: Bestimmt die Art des Rahmens.
  • Werte: none, complex, raised, static, sunken
  • Beispiel: borderStyle="sunken"
  • Bemerkung: Hat nur Auswirkung auf den inneren Rahmen.
  • JScript-Eigenschaft: borderStyle
  • Standardwert: normal
caption
  • Beschreibung: Bestimmt, ob das Fenster eine Titelzeile hat.
  • Werte: yes, no
  • Beispiel: caption="yes"
  • Bemerkung: Ohne das Attribut werden keine Minimieren- und Maximieren-Buttons angezeigt.
  • JScript-Eigenschaft: caption
  • Standardwert: yes
icon
  • Beschreibung: Bestimmt den Dateinamen des Symbols für die Anwendung.
  • Werte: Zeichenkette
  • Beispiel: icon="datei.ico"
  • Bemerkung: Die Graphik muss 32 × 32 Pixel gross sein und ein gültiges Icon-Format aufweisen.
  • JScript-Eigenschaft: icon
  • Standardwert: Systemsymbol
maximizeButton
  • Beschreibung: Bestimmt, ob das Fenster einen Maximieren-Button haben soll.
  • Werte: yes, no
  • Beispiel: maximizeButton="yes"
  • Bemerkung: caption muss angezeigt werden.
  • JScript-Eigenschaft: maximizeButton
  • Standardwert: yes
minimizeButton
  • Beschreibung: Bestimmt, ob das Fenster einen Minimieren-Button haben soll.
  • Werte: yes, no
  • Beispiel: minimizeButton="yes"
  • Bemerkung: caption muss angezeigt werden.
  • JScript-Eigenschaft: minimizeButton
  • Standardwert: yes
showInTaskBar
  • Beschreibung: Bestimmt, ob die HTA in der Taskleiste erscheint.
  • Werte: yes, no
  • Beispiel: showInTaskBar="yes"
  • Bemerkung: Hat keine Auswirkung darauf, dass die Anwendung bei Alt+Tab erscheint.
  • JScript-Eigenschaft: showInTaskBar
  • Standardwert: yes
singleInstance
  • Beschreibung: Bestimmt, ob nur eine Instanz der Anwendung erlaubt ist.
  • Werte: yes, no
  • Beispiel: singleInstane="yes"
  • Bemerkung: Die Anwendung wird durch den applicationName identifiziert, nicht durch den URL.
  • JScript-Eigenschaft: singleInstance
  • Standardwert: no
sysMenu
  • Beschreibung: Bestimmt, ob die HTA Systemschaltflächen (Icon, Maximieren- und Minimieren-Buttons) hat.
  • Werte: yes, no
  • Beispiel: sysMenu="yes"
  • Bemerkung: Sollte immer auf yes gesetzt sein.
  • JScript-Eigenschaft: sysMenu
  • Standardwert: yes
version
  • Beschreibung: Bestimmt die Version der HTA.
  • Werte: Zeichenkette
  • Beispiel: version="1.4"
  • Bemerkung: Die Version erscheint in den Eigenschaft der Anwendung.
  • JScript-Eigenschaft: version
  • Standardwert: —
windowState
  • Bestimmt die Anzeigegrösse der HTA.
  • Werte: normal, maximize, minimize
  • Beispiel: windowState="maximize"
  • Bemerkung: normal bedeutet, dass die Standard-Anzeigegrösse des Internet Explorers übernommen wird. maximize zeigt die Anwendung über das ganze Fenster an, minimize nur als Symbol in der Taskleiste.
  • JScript-Eigenschaft: windowState
  • Standardwert: normal
commandLine
  • Beschreibung: Enthält die Befehlszeilenargumente, mit denen die HTA gestartet wurde.
  • Werte: Nur lesend
  • Beispiel: command = htaObj.commandLine
  • Bemerkung: Gibt eine leere Zeichenkette zurück, wenn die HTA über HTTP gestartet wurde.
  • JScript-Eigenschaft: commandLine
  • Standardwert: —

Befehlszeilenargumente

In vielen Programmen gibt es sog. Befehlszeilenargumente. Zum Beispiel beim Aufruf eines Programms mit: „X:\command.hta -param1 -param2“ sollen die Parameter „param1“ und „param2“ eine Auswirkung auf das Programm haben. In HTA lassen sich diese Parameter über die Eigenschaft commandLine auswerten.

Namen der Datei festlegen

id="MyCommandApp"

Über die Eigenschaft id lässt sich der Name einer Anwendung bestimmen. Der Name spielt insofern eine Rolle, dass die Eigenschaft commandLine dem Namen zugeordnet ist, d. h. um die Eigenschaft auszulesen, ist z. B. hier folgender JScript-Code nötig:

MyCommandApp.commandLine

Parameter auswerten

alert(MyCommandApp.commandLine);
parameters = MyCommandApp.commandLine.replace(/ /g, '').split('-');
for (var i = 1; i < parameters.length; i++)
  alert(parameters[i]);

In der ersten Zeile wird zunächst einmal die komplette Befehlszeile (samt Aufruf des Programms) in einem Meldungsfeld ausgegeben.

Um die Parameter geordnet in einem Array zu speichern, werden zuerst alle Leerzeichen (replace) entfernt, dann wird die Befehlszeile anhand des „-“ in die Variable parameters als Array aufgeteilt. Im ersten Element von parameters steht der Aufruf des Programms, deshalb beginnen wir die Schleife mit dem zweiten Element.

Für die Befehlszeile „X:\command.hta -param1 -param2“ wird die HTA folgende Ausgabe bringen:

Beispiel zur Auswertung der Befehlszeile (commandline.zip)

Beispiel zur Auswertung der Befehlszeile, die an eine HTA übergeben wurde.

Fehlerbehandlung

Ab dem Internet Explorer 5 gibt es die Möglichkeit, Fehler in J(ava)Script zu behandeln. Mit der try...catch-Anweisung wird einem Block von Anweisungen eine Fehlerbehandlungsroutine hinzugefügt. Über sogenannte Ausnahmen können eigene Fehlermeldungen ausgegeben bzw. die Fehler unterdrückt werden. Die Fehlerbehandlung kann zentral in einer Funktion stehen.

Fehler auffangen und ausgeben

Folgenden Code in einem JScript ablegen:

function centralErrHandler() {
  try {
    errorOne();
  } catch (e) {
    alert(e.description);
  }
  
  try {
    errorTwo();
  } catch (e) {
    alert(e.description);
  }
}

In der Funktion centralErrHandler werden die Fehler, die beim Ausführen der Funktionen errorOne und errorTwo auftreten, ausgewertet. Nach dem ein Fehler in einem try-Block aufgetreten ist, wird der try-Block verlassen und der catch-Block ausgeführt. e bezeichnet eine Variable vom Typ Error, also e beschreibt den Fehler. In e.description steht die Fehlermeldung.

Fehler weiterleiten

function errorOne() {
  try {
    document.formSample.test = 'ok';
  } catch (e) {
    throw e;
  }
}

Mit document.formular.test wird ein Fehler erzeugt, da es kein Objekt formular gibt. Der try-Block wird demnach verlassen und die Anweisung in catch ausgeführt. Um die Fehler zentral auszuwerten, kann man den Fehler „werfen“, d. h. dass der Fehler an die übergeordnete Funktion (Aufrufer) weitergeleitet wird.

Eigenen Fehler definieren

function errorTwo() {
  var Schalter = 1;
  if (Schalter == 1) {
    e = new Error(11111, 'Falsche Eingabe');
    throw e;
  }
}

Mit new Error(...) kann eine eigene Ausnahme erstellt werden. Als Parameter können eine Fehlernummer und ein Fehlertext angegeben werden. Der Fehlertext steht wiederum in der Eigenschaft description und nachdem der eigene Fehler wieder an die Funktion centralErrHandler weitergeleitet wird, wird dort der Fehlertext „Falsche Eingabe“ in einem Meldungsfeld ausgegeben.

Werfen und Einfangen von Ausnahmen (exceptions.zip)

Dieses Beispiel zeigt das Werfen und Einfangen von Ausnahmen.

Suche in Datei

Nach Auswahl einer Datei mit „Durchsuchen...“ kann diese im Textfeld angezeigt werden. Nach Eingabe eines Suchbegriffs und Betätigen der Schaltfläche „Suche starten“ wird das erste Vorkommen des Suchbegriffs in der Datei in einem Meldungsfeld ausgegeben.

Anzeigen der Datei

var fso = new ActiveXObject("Scripting.FileSystemObject");
.
.
.
function showFile() {
  var file = fso.OpenTextFile(document.fileForm.fileName.value, 1);
  document.formFile.fileContent.value = file.ReadAll();
}

Als Grundvoraussetzung für den Zugriff auf das lokale Dateisystem wird das ActiveX-Objekt FSO (Scripting.FileSystemObject) benötigt. Die Funktion showFile regelt die Anzeige des Inhalts einer Datei in das Textfeld.

Mit OpenTextFile wird die ausgewählte Datei zum Lesen geöffnet.

Parameter:

ReadAll liest den gesamten Inhalt der Datei, mit der Zuweisung wird das Textfeld mit dem Inhalt der Datei gefüllt.

Suche in der Datei

function search(searchFor) {
  var file = fso.OpenTextFile(document.fileForm.fileName.value, 1);
  var fileContent = file.ReadAll();
  alert('Gefunden an Position: ' + fileContent.indexOf(searchFor));
}

Die Datei wird wiederum geöffnet und der Inhalt mit ReadAll ausgelesen. Der Inhalt wird dieses Mal aber in der Variablen fileContent gespeichert. Das erste Vorkommen in der Datei lässt sich dann einfach mit indexOf ermitteln und in einem Meldungsfeld mit alert ausgeben.

Laden und Durchsuchen einer Textdatei (searchinfile.zip)

Durchsuchen einer Datei nach einem vorgegebenen Text.