======================================
 Programm MiniOle - Version 1.1.3
           Freeware                 
                                    
 von Heiko Rost (heiko.rost@gmx.de) 
======================================


1. Beschreibung:
================

Das Programm stellt einige zustzliche Funktionen fr den Windows
Scripting Host zur Verfgung. Es wurde zur besseren Scriptsteuerung fr
Hamster Classic (https://hamster-classic.de/) per VB geschrieben, kann 
aber natrlich auch in jedem anderen Script genutzt werden.

Wichtig ab Version 1.1.3: Bei meinem aktuellen Internetprovider ist die 
      Nutzung des DF-Netzwerkes nicht mglich. Deshalb kann ich im Falle von 
      Problemen mit den zugehrigen Funktionen (Abschnitt 4.3) keine Fehlersuche 
      und Korrektur mehr vornehmen.


2. Systemvoraussetzungen:
=========================

Ein 32/64-bit-Windows mit dem Windows Scripting Host.


3. Installation:
================

Das Programm mu in einen Ordner auf der Festplatte kopiert und einmal 
gestartet werden. Es erscheint als Symbol im Systray und mu dort anschlieed  
durch einem Klick mit der rechten Maustaste und "Ende" geschlossen werden. 
Innerhalb eines Scriptes erfolgen Start und Ende automatisch.

Unter mit Windows 7/64 (und mglicherweise auch anderen Versionen) kann es Probleme 
geben, wenn der komplette Pfadname an irgendeiner Stelle Leerzeichen enthlt. 

4. Nutzung in eigenen Scripten:
===============================

Die Syntaxbeispiele basieren auf VB, bei anderen Sprachen mssen sie
entsprechend angepat werden. Als Objektnamen werden MiniOle und Hamster
verwendet, diese mssen mit Wscript.CreatObject erzeugt worden sein.

Das Programm startet automatisch, sobald im Script das entsprechende
Objekt erstellt wird.

 Set MiniOle = Wscript.CreateObject("ScriptFunctions.App")


4.1. Informationen ber MiniOle
-------------------------------

4.1.1. ShowInfo
---------------

Es wird eine Infobox ber das Programm angezeigt.

Syntax: ShowInfo


4.1.2. MinioleVersion
---------------------

Die Versionsnummer von MiniOle wird ermittelt.

Syntax: <nummer> = MinioleVersion

Es wird immer ein String mit sechs Zeichen bergeben, zum Beispiel 010100 bei Version 1.1.0.


4.1.3. MinioleIniName
---------------------

Der komplette Name der von MiniOle benutzten Ini-Datei wird ermittelt-

Syntax: <ininame> = Miniole.MinioleIniName


4.2. Fensterfunktionen
----------------------

4.2.1. WindowExists
-------------------

Diese Funktion ermittelt, ob ein Fenster mit dem angegeben Namen
existiert.

Syntax: <logischer wert> = WindowExists(<fenstername>)

Es mu nicht der komplette <fenstername> angegeben werden, die Suche
nach "Editor" ergibt beispielsweise wahr, wenn ein Fenster mit dem Namen
"Editor - test1.txt" existiert

 If MiniOle.WindowExists("Hamster") Then
   Wscript.Echo "Der Hamster ist zur Zeit aktiv"
  Else
   Wscript.Echo "Der Hamster schlft gerade"
 End If


4.2.2. CloseWindow
------------------

Es wird ein Fenster mit dem angegebenen Namen gesucht und versucht zu
schlieen.

Syntax: closeWindow(<fenstername>)

Der Aufruf entspricht weitestgehend dem "normalen" Beenden des
Programmes, eine evtl. Meldung wie "Dokument vor dem Beenden speichern?"
wird wie sonst auch angezeigt. Existieren mehrere Fenster mit dem Namen
wird das erste gefundene geschlossen.

 MiniOle.CloseWindow("Editor")


4.2.3. WndGetList
-----------------

Es wird eine Liste aller Fenster zurckgegeben, die mit dem angegebenen
Suchmuster bereinstimmen. Bei keinem entsprechendem Fenster gibt die
Funktion eine leere Zeichenkette zurck.

Syntax: <liste> = WndGetList(<muster>, <trenner>)

Es werden die Titel aller geffneten Fenster mit <muster> (regulrer
Perl-Ausdruck) verglichen und alle bereinstimmenden zurckgegeben. Die
einzelnen Namen sind durch <trenner> abgegrenzt.

Diese Funktion kann, im Gegensatz zu WindowExists, auch Fenster finden,
bei denen der Anfang des Namens nicht bekannt ist. Mit

 wscript.echo miniole.WndGetList(" - netscape$",chr(13)+chr(10))

werden die Titel aller Fenster angezeigt, die mit " - netscape" enden.


4.2.4. WndClose
---------------

Es werden (wahlweise alle) Fenster geschlossen, deren Titel mit dem
Suchmuster bereinstimmen und die Liste aller betroffenen Fenster
zurckgegeben.

Syntax: <liste> = WndClose(<muster>,<trenner>,<alle>)

Fr <muster> und <trenner> gilt das unter WndGetList geschriebene. Wenn
<alle> True ist, werden alle gefundenen Fenster geschlossen.

Der Aufruf von

 wscript.echo miniole.WndClose("microsoft internet explorer$",chr(13)+chr(10),true)

schliet den IE und zeigt an, um welche Fenster der Desktop erleichtert
wurde. Diese Funktion ist mit Vorsicht zu gebrauchen, im Zweifelsfall
sollte vorher mit WndGetList geprft werden, was alles mit <muster>
bereinstimmt. 


4.3. DF-Netzwerk
-----------------

4.3.1. GetRasConnection
-----------------------

Es wird der Name der aktuellen DF-Netzwerkverbindung ermittelt. Ist
keine aktiv, gibt die Funktion eine leere Zeichenkette zurck.

Syntax: <verbindungsname> = GetRasConnection

Mit folgendem Beispiel kann abhngig von der Verbindung der SMTP-Server
fr die ausgehenden eMails gewhlt werden:

 Select Case MiniOle.GetRasConnection
  Case "Provider1"
   Hamster.ControlRunSendMail smtp.provider1, "", ""
  Case "Provider2"
   Hamster.ControlRunSendMail smtp.provider2, "", ""
  Case Else
   Wscript.Echo "Keine Mailauslieferung mglich"
 End Select


4.3.2. RasClose
---------------

Es wird eine evtl. bestehende DF-Verbindung getrennt.

Syntax: <verbindungsname> = RasClose


4.3.3. LCR-Funktionen
---------------------

Mit den folgenden Funktionen knnen selbstdefinierte Tarifdaten
ausgewertet werden, um die zum aktuellen Zeitpunkt gnstigste DF-
Verbindung zu ermittlen. Haben mehrere den gleichen Preis, wird die mit
der kleinsten Nummer unter [LCR] in miniole.ini bzw. unter [Connections]
in tk32.ini als gnstigste angesehen.

Ab Version 1.1.1 kann jeder Nutzer von Juergen Haibles Programm Telekost 32 
(TK32) die dort benutzten Tarifinformationen nutzen. Dabei ist folgendes
zu beachten:

In MiniOle wird normalerweise mit Pfennigen gerechnet, TK32 benutzt als
Eingheit DM. Auswirkungen kann das haben, wenn mit den von GetRasLCRInfo
zurckgegebenen Betrgen weitergerechnet wird.

TK32 rechnet bei den Kosten je Einheit mit maximal vier Stellen hinter
dem Komma, deshalb sind in den Tarifdateien manche sekundengenau
abrechnenden Provider mit leicht gerundeten Werten eingetragen. Dadurch
kann der errechnete Preis etwas vom angegebenen Minutenpreis abweichen.



4.3.3.1. GetRasLCRName
----------------------

Die Funktion ermittelt den Namen der DF-Verbindung, die zum aktuellen
Zeitpunkt fr die angegebene Verbindungsdauer in Sekunden am
preiswertesten ist. Als maximale Verbindungsdauer knnen 86400 Sekunden
(1 Tag) angegeben werden, bei der Angabe von lngeren Zeiten wird nur mit
diesem Hchstwert gerechnet.

Kann der Name nicht ermittelt werden, wird eine leere Zeichenkette
zurckgegeben. Die Verbindungstarife mssen in die Datei miniole.ini
(s. u.) oder bei TK32 eingetragen sein.

Syntax: <verbindung> = GetRasLCRName(<dauer in sekunden>)

Mit den folgenden Befehlen wird getestet, ob eine Online-Verbindung
besteht. Bei Bedarf wird die gnstigste aufgebaut und am Ende wieder
getrennt.

 Verbindung=""
 if MiniOle.GetRasConnection="" then
   Verbindung=MiniOle.GetRasLCRName(60)   'geschtzte Dauer: 60 Sekunden
   if Verbindung="" then
     Wscript.echo "Gnstigste DF-Verbindung kann nicht ermittwelt werden"
     Wscript.Quit
   end if
   if not Hamster.rasdial(Verbindung,"","") then
     Wscript.Echo "Fehler beim Verbindungsaufbau"
     Wscript.Quit
   end if
 end if
 'hier alle Befehle zum Senden und Empfangen einfgen, dabei evtl. abhngig
 'von der aktuellen Verbindung nur die verfgbaren Server verarbeiten
 '(siehe Beispiel fr GetRasConnection)
 Hamster.ControlWaitIdle 0
 if Verbindung<>"" then
   'nur trennen, wenn Verbindung ber dieses Script aufgebaut
   Hamster.RasHangup
 end if
 

4.3.3.2. GetRasLCRInfo
----------------------

Die Funktion erstellt eine Liste mit den Preisen aller fr die
LCR-Berechnung benutzten Verbindungen. Es wird die angegebene <dauer>
ausgewertet, die einzelnen Eintrge durch <trenner> voneinander
getrennt.

Syntax: <liste> = GetRasLCRInfo(<dauer in sekunden>,<trenner>)

Folgendes Beispiel zeigt die gnstigste Verbindung fr 60 Sekunden
sowie alle Preise:

 CrLf = chr(13)+chr(10)
 Wscript.echo "am gnstigsten: "+miniole.GetRasLcrName(60)+CrLf+CrLf+_
              "Gesamtliste: "+miniole.GetRaslcrInfo(60,"; ")

Mit dem ini-Eintrag SortiereListe kann festgelegt werden, ob die Liste
nach Preis sortiert wird.


4.4. Ini-Dateien und Registry
-----------------------------

4.4.1. IniRead
--------------

Die Funktion liest Werte aus einer Ini-Datei.

Syntax: <wert> = IniRead(<datei>,<sektion>,<schlssel>,<vorgabewert>)

Das folgende Beispiel liest die hamster.ini und ermittelt den Preferred
Postserver sowie die Port-Nummer des lokalen NNTP-Servers:

 const inidatei="d:\download\hamster\hamster.ini"            'anpassen
 Wscript.echo "Post-Server: " & MiniOle.IniRead(inidatei,"setup","preferred.postserver","")
 Wscript.echo "NNTP-Port: " & MiniOle.IniRead(inidatei,"setup","local.port.nntp",0)


4.4.2. IniWrite
---------------

Die Prozedur schreibt Werte in eine Ini-Datei.

Syntax: IniWrite <datei>,<sektion>,<schlssel>,<vorgabewert>

Bei fehlerhaften Werten in einer ini-Datei kann sich das Verhalten des
entsprechenden Programmes unvorhersehbar ndern. Diese Prozedur also
wirklich nur einsetzen wenn man die Folgen kennt.

Mit dem folgenden Beispiel wird der Hamster so eingestellt, da er beim
nchsten Start den lokalen News-Server auf den Port 1190 legt. 

 const inidatei="d:\download\hamster\hamster.ini"       'anpassen
 MiniOle.IniWrite inidatei,"setup","local.port.nntp",1190


4.4.3. IniDeleteKey
-------------------

Es wird der angegebene Schlssel aus der Ini-Datei gelscht.

Syntax: IniDeleteKey <datei>,<sektion>,<schlssel>

Das folgende Beispiel lscht die Eintrge fr die preferred-Server:

 const inidatei="d:\download\hamster\hamster.ini"       'anpassen
 MiniOle.IniDeleteKey inidatei,"setup","preferred.postserver"
 MiniOle.IniDeleteKey inidatei,"setup","preferred.smtpserver"


4.4.4. IniReadSections
----------------------

Die Funktion erstellt eine Liste aller Sektionen der angegebenen
Ini-Datei.

Syntax: <liste> = IniReadSections(<datei>,<trenner>)


4.4.5. IniReadSection
---------------------

Die Funktion erstellt eine Liste aller Schlssel in der angegebenen
Sektion der Ini-Datei

Syntax: <liste> = IniReadSection(<datei>,<sektion>,<trenner>)


4.4.6. IniReadSectionValues
---------------------------

Die Funktion erstellt eine Liste aller Schlssel mit ihren Werten in der
angegebenen Sektion der Ini-Datei.

Syntax: <liste> = IniReadSektionValues(<datei>,<sektion>,<trenner>)


4.4.7. GetPerfStats
-------------------

Es werden Daten aus HKEY_DYN_DATA/PerfStats/StatData ausgelesen. Damit
ist es mglich, verschiedene Angaben ber den Systemstatus zu erhalten
wie sie zum Beispiel mit dem Systemmonitor angezeigt werden.

Syntax: <wert> = GetPerfStats(<schlssel>)

Die Beschreibung der einzelnen Schlssel sind in der Registry unter
HLM\System\CurrentControlSet\control\PerfStats\Enum zu finden.


5. miniole.ini
==============

Beim ersten Programmstart wird diese Datei mit einigen Vorgabewerten
erstellt.

[Fenster]
;3 Zeilen mit Fensterposition und -stil fr den Testmodus
Links=0
Oben=0
Vordergrund=1

;wenn =1, startet das Programm mit einem bedienbaren Hauptfenster. In
;den Eingabefeldern knnen Parameter eingegeben und einige Funktionen per
;Hand ber das Test-Men aufgerufen werden. Gleichzeitig wir eine
;Log-Datei erstellt und die zuletzt aufgerufene Funktion angezeigt.
Testmodus=0

;wenn =1 wird das Programm (auer im Testmodus) vollstndig unsichtbar
;gestartet. Im Taskmanager ist es noch zu finden und kann dort notfalls
;beendet werden.
Unsichtbar=0

;wenn =1 wird ein Log aller Aktionen erstellt. Ein bereits existierendes
;Log wird beim Programmstart berschrieben. Der Eintrag wird ignoriert
;wenn Testmodus=1
SchreibeLog=0

..............

Die nchsten Eintrge sind fr die GetRasLCR-Funktionen notwendig und
mssen per Hand vorgenommen werden. Als Beispiele sind die von mir
genutzten Provider knUUt 1.0 ber MCI WorldCom und NGI by Call mit den
Preisen vom 1.6.2000 aufgefhrt.

[LCR]
;Es folgen die Namen der auszuwertenden Verbindungen des DF-Netzwerkes.
;Maximal sind 100 (von 0= bis 99=) mglich. Haben mehrere bei der
;Auswertung den selben Preis, wird die mit der kleinsten Nummer als
;gnstigste zurckgeliefert.
10=NGI by Call
20=knUUt

;an den folgenden Tagen gelten die Feiertagstarife. Dieser Eintrag wird
;nur verarbeitet, wenn TK32Mode=0
FtListe=1.6.2000 11.6.2000 12.6.2000 3.10.2000 25.12.2000 26.12.2000 31.12.2000

;Folgender Eintrag legt fest, ob und wie TK32 genutzt wird
;0 - TK32 wird nicht genutzt
;1 - die Namen der Verbindungen werden aus miniole.ini gelesen,
;    Feiertage und Tarife aus tk32.ini und den zugehrigen Tarifdateien 
;    (auf genaue bereinstimmung der Verbindungsnamen achten)
;2 - Verbindungen, Feiertage und Tarife werden aus tk32.ini bzw. den
;    zugehrigen Tarifdateien gelesen
TK32Mode=0

;Im folgenden Eintrag wird der Installationspfad von TK32 eingetragen.
;MiniOle prft, ob die Datei tk32.ini im angegebenen Pfad vorhanden ist.
;Wenn nicht, wird die gesamte Festplatte durchsucht und der gefundene
;Pfad gespeichert.
TK32Pfad=C:\Programme\Online\TelKost\

;Hier wird festgelegt, ob die Liste von GetRasLCRInfo sortiert wird
;-1: teuerste Verbindung zuerst
; 0: keine Sortierung
; 1: preiswerteste Verbindung zuerst
SortiereListe=0


;Fr jeden Provider ist (wenn TK32Mode=0) eine eigene ini-Sektion ntig.
;Der Name wir aus der Zeichenkette LCR, einem Leerzeichen und dem Namen
;der DF-Verbindung gebildet.
;
;Obwohl knUUt und NGI im Sekundentakt abrechnen, sind jeweils
;Minutenpreise in Pfennig angegeben. Dadurch werden zum einen
;Rundungsfehler vermieden und zum anderen die Eintrge bersichtlicher.
;Wer Wert auf korrekte Auswertung fr kurze Verbindungen legt, sollte
;Taktzeiten von 1 s whlen und entsprechende krumme Pfennigbetrge
;einsetzen (die Taktzeiten mssen ganze Zahlen sein).
;
;Die Kostenprofile werden in der Form
;Name=<zeitpunkt> <taktpreis> <taktdauer> <zeitpunkt> <taktpreis> <taktdauer>...
;angegeben. Der erste Zeitpunkt mu 00:00 sein, alle weiteren sind 
;aufsteigend einzutragen.

[LCR NGI by Call]
;keine Einwahlgebhr, die Zeile ist in diesem Beispiel aufgefhrt
;und mu nur vorhanden sein, wenn eine Einwahlgebhr anfllt
Ew=0
;es folgt der frei whlbare Name des Kostenprofiles fr alle Tage der
;Woche und die Feiertage
Mo=Alle
Di=Alle
Mi=Alle
Do=Alle
Fr=Alle
Sa=Alle
So=Alle
Ft=Alle
;einfaches Profil, es kostet ab 00:00 Uhr den ganzen Tag 2,49 Pfennig fr
;60 Sekunden
Alle=00:00 2,49 60

[LCR knUUt]
;in der Woche gilt das Profil Woche
Mo=Woche
Di=Woche
Mi=Woche
Do=Woche
Fr=Woche
;an Wochenenden und Feiertagen das Profil WEnde
Sa=WEnde
So=WEnde
Ft=WEnde
;Kosten sind 2 bzw. 0 Pf. fr knUUt sowie Telefon von MCI 
Woche=00:00 2,3 60 08:00 4,3 60 09:00 6,6 60 18:00 5,5 60 20:00 3,5 60 21:00 2,3 60
WEnde=00:00 2,3 60 09:00 4,6 60 18:00 3,5 60 21:00 2,3 60


6. Dank an...
=============

...Luu Tran fr seine Delphi-Umsetzung von Philip Hazel's PCRE 
(Perl Compatible Regular Expression).

...Angus Robertson (Magenta Systems Ltd., delphi@magsys.co.uk,
http://www.magsys.co.uk/delphi/) und Daniel Polistchuck fr ihre
RAS-Komponente.

...Juergen Haible fr sein TeleKost32 und die damit verbundenen 
Tarifdateien.

7. Versionsbersicht:
=====================

1.0 - 23.10.1999
erste Programmverffentlichung 

1.01 - 27.11.1999
neu: IniRead-/IniWrite-/IniDeleteKey-Methoden

1.02 - 27.12.1999
neu: GetRasLCRName/GetRasLCRInfo-Methoden
neu: Testmodus zur Protokollierung und Fehlersuche
neu: Programm kann komplett unsichtbar gestartet werden
fix: Mehrfachstart wird unterbunden

beta 1.1.0 - 7.1.2000
nd: neue COM-Schnittstelle fr Nutzung unter Perl von ActivState

1.1.0 - 9.2.2000
nd: Log auch ohne Testmodus mglich
neu: IniReadSektions/IniReadSection/IniReadSectionValues/GetPerfStats
neu: WndGetList/WndClose
neu: RasClose

1.1.1 - 31.5.2000
neu: TK32-Tarife knnen fr die LCR-Funktionen genutzt werden
neu: GetRasLCRInfo liefert wahlweise eine sortierte Liste

1.1.2 - 2.6.2000
fix: TK32-Verbindungen ohne Telefon- bzw. Internettarif erzeugen eine
     Fehlermeldung

1.1.3 - 03.2017
fix: Das Symbol im Systray wurde manchmal nicht angezeigt
nd: Fehlerbehandlung durch MadExceot <http://www.madshi.net/>
nd: Alle Funktionen zum DF-Netzwerk (Punkt 4.3.) sind noch enthalten, werden 
     aber als obsolet angesehen und im Problemfall nicht mehr korrigiert