AutoIt: COM

Aus Wikibooks
Wikipedia hat einen Artikel zum Thema:

Was ist COM?[Bearbeiten]

Das Component-Object-Model (abgekürzt: COM) ist ein von Microsoft entwickeltes, auf dem Client/Server-Prinzip basierendes Konzept, bei dem ein Client (z.B. ein AutoIt-Script) einen Server (z.B. Microsoft Office Word) fernsteuert. Dabei stellt der Server ein Interface zur Verfügung, welches dann die ganzen Methoden und Eigenschaften vereinbart.

Was sind Methoden und Eigenschaften?[Bearbeiten]

Methoden (engl: method) sind quasi "Funktionen" eines COM Objekts. Eigenschaften (engl: property) ist eine Art von Variable, deren Wert man auslesen und teilweise auch ändern kann.

Was kann ich alles mit COM anfangen?[Bearbeiten]

Es gibt schon viele von Windows vorab integrierte COM Objekt zum Beispiel zur Steuerung der Windows Shell, Verarbeitung von XML Dateien oder der Ausgabe von Text in gesprochener Form (text-to-speech). Andere Microsoft Produkte wie Office oder Software von Drittanbietern stellen teilweise auf COM Objekt zur Verfügung. So kann man zum Beispiel Word Dokumente erstellen und beliebig verändern. Mann sollte aber grundsätzlich erst überprüfen ob die gewünscht Funktion, sich nicht durch AutoIt interne Funktionen lösen lässt bzw durch eine UDF.

Wie ermittel ich die Methoden und Eigenschaften eines COM Objekts?[Bearbeiten]

  1. Sie lesen die Dokumentation des Herstellers (Bei Microsoft: msdn)
  2. Sie ermitteln diese mit Hilfe des Programms "OLE/COM Object Viewer" (oleview.exe) aus den Windows Server 2003 Resource Kit Tools, mit diesem Programm können sie sich des Weiteren auch alle COM Objekte auf ihrem Computer anzeigen lassen.
  3. In der Windows PowerShell durch die Eingabe von:
PS> new-object -comobject <Name des COM Objekts z.B shell.application> | get-member

COM mit AutoIt[Bearbeiten]

Gehen wir mal davon aus sie wollen den Ordner für Temporäre Dateien im Explorer öffnen.

$oShell = ObjCreate( "shell.application" )
$oShell.open ( @TempDir )

In der ersten Zeile wurde nun ein neues COM-Objekt mit dem Namen "shell.application" erstellet. "shell.application" stellt eine Methode Namens "open" bereit mit der man Ordner etc. mit dem Explorer öffnen kann. Wie man sieht wird das Objekt und die Methode mit einem Punkt "." von einander getrennt, außerdem kann man Methoden Variablen genauso übergeben wie normalen AutoIt Funktionen. @TempDir ist einfach nur der Pfad zu dem Ordner für Temporäre Dateien (%temp%).

Es können beliebig viele Methoden und Eigenschaften verknüpft werden, falls das COM-Objekt dieses zulässt bzw eine Objekt zurückgibt.

$oShell = ObjCreate( "shell.application" )
MsgBox (0,"Explorer Fenster", "Sie haben im moment " & $oShell.Windows().count & " Explorer Fenster geöffnet")

In diesem Fall gibt Windows ein Objekt vom Typ "ShellWindows" zurück, welches die Eigenschaft "count" besitzt.

Bestimmte Eigenschaften, können wie schon erwähnt geändert werden:

$oWMP = ObjCreate ( "WMPLayer.ocx" ) ;Erstellt ein Windows Media Player Objekt (http://msdn.microsoft.com/en-us/library/bb249680(VS.85).aspx)
$oWMP.URL = "http://hr.streamfarm.net/cms/_vm100/radio/live/hr3_cms.asx" ;Stellt die Eigenschaft "URL" zu dem Online-Stream
;von hr3.de ein, sollte automatisch starten

$oWMP.controls.play() ;explizit starten

While $oWMP.playstate > 2 ;solang der Windows Media Player den Stream lädt, buffert, abspielt usw.
	Sleep ( 10 ) ;schlafen, damit AutoIt sich nicht beendet und die Musik aufhört
WEnd

With...EndWith[Bearbeiten]

Das With Statment ist dafür gedacht lange Objekt-Verkettungen abzukürzen. With Staments dürfen jedoch nicht geschachtelt werden!

$oWMP = ObjCreate ( "WMPLayer.ocx" )
$oWMP.Url = "http://hr.streamfarm.net/cms/_vm100/radio/live/hr3_cms.asx"

With $oWMP.controls.currentItem ;Abkürzung
	MsgBox (0, "", "Der Windows Media Player spielt zu Zeit '" & .name & "'" & @crlf & "Adress: '" & .sourceUrl & "'")
EndWith
#cs Der unschöne Weg:
MsgBox (0, "", "Der Windows Media Player spielt zu Zeit '" & $oWMP.controls.currentItem.name & "'" & @crlf & "Adress: '" & _
    $oWMP.controls.currentItem.sourceUrl & "'")
#ce

For..In[Bearbeiten]

Folgt

$oShell = ObjCreate( "shell.application" )

$oWindows = $oShell.Windows()

If $oWindows.Count > 0 Then

	For $oWindow In $oWindows 
		$hWnd = HWnd ($oWindow.Hwnd) ; Liest den Window Handle (Hwnd) des Fensters aus und wandelt es in den richtigen Datentype. 
									 ; Bei Manchen Fenstern kann das zu einem Fehler fürhen!
		WinActivate ($hWnd) ; Aktiviert Explorer Fenster
		Sleep ( 5000 ) ; Wartet 5 Sekunden
		WinSetState ( $hWnd, "", @SW_MINIMIZE) ; Minimiert es wieder
	Next
	
	
	;Das selbe liesse sich durch folgenden Code auch lösen
	
	$iCount = $oWindows.Count -1 ; -1 da wie bei der AutoIt Funktion eben die Anzahl der Wert zurückgeben wird, und nicht der höchste Index
	For $i = 0 To $iCount
		$hWnd = HWnd ($oWindows.Item ($i).Hwnd) ; Mit Item ($i) kann man auf ein bestimmtes Item zugreifen (ähnlich wie bei Arrays)
		MsgBox (0, "(Internet) Explorer Fenster Nr." & ($i+1) , WinGetTitle ($hWnd)) ; Dieses geben wir nur den Titel Aus
	Next
Else
	MsgBox (64, "Error", "Es gibt keine (Internet) Explorer Fenster!")
EndIf

COM Events[Bearbeiten]

$oWMP = ObjCreate ( "Wmplayer.ocx") ;Objekt erstellen
ObjEvent ( $oWMP, "_WMPEvents_", "_WMPOCXEvents") ;

$oWMP.url = "http://hr.streamfarm.net/cms/_vm100/radio/live/hr3_cms.asx"

While $oWMP.playstate > 2
	Sleep ( 10 )
WEnd

func _WMPEvents_PlayStateChange ( $iNewState )
	ConsoleWrite ( "Playstate changed to: '" & $iNewState & "'" & @CRLF)
EndFunc