Schlagwort-Archive: autoit

autoit GUI Form

Standard Definitionen:

 

$GuiFrmWidth                = 500                ; Formular-Breite (Fenster-Breite)

$GuiFrmHight                = 450                ; Formular-Höhe  (Fenster-Höhe)

$GuiFrmMarginTop                = 10                ; Rand oben

$GuiFrmMarginRight        = 10                ; Rand rechts

$GuiFrmMarginBottom        = 10                ; Rand unten

$GuiFrmMarginLeft                = 10                ; Rand links

 

$GuiFrmLineHight                = 20                ; Zeilen-Höhe

$GuiFrmLineMargin                = 5                ; Zeilen-Abstand

$GuiFrmColWidth                = 150                ; Spalten-Breite

$GuiFrmColMargin                = 20                ; Spalten-Abstand

 

$GuiFrmCol1                = $GuiFrmMarginLeft

$GuiFrmCol2                = $GuiFrmMarginLeft + $GuiFrmTabWidth + $GuiFrmTabMargin

 

$GuiTabWidth                = $GuiFrmWidth – $GuiFrmMarginLeft – $GuiFrmMarginRight

$GuiTabHeight                = $GuiFrmHight – $GuiFrmMarginTop – $GuiFrmMarginBottom

 

$GuiFrmFontSize          = 10

local $GuiLine                = 0

 

Form erstellen:

 

       GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
 

$frmCustData = GUICreate("CustomData",$GuiFrmWidth,$GuiFrmHight,-1,-1,-1,-1)

 

 

autoit GUI

GUI Turtorials:        http://www.youtube.com/user/AutoIt96?feature=watch

 

Textfarbe eines GuiControls setzen:

               GUICtrlSetColor($lblInitResult,0x009700)                ; blass-grüner Text

               GUICtrlSetColor($lblInitResult,0xEC0000)                ; blass-roter Text

 

Hintergrundfarbe eines GuiControls setzen:

               GUICtrlSetBkColor($lblInitResult,0xFFFFB9)                ; blass-gelber Hintergrund

               GUICtrlSetBkColor($lblInitResult,0xEC0000)                ; blass-roter Hintergrund

 

 

Eigenschaften für GUI-Objekte setzen mit BitOR:

z.B.: $edit = $edit = GUICtrlCreateEdit("Texts", 10, 10, 700, 300, BitOr($WS_VSCROLL,  $ES_AUTOVSCROLL, $ES_READONLY))

 

 

Make Window resizable:

Global $frmCustData = GUICreate($ProgName,$frmWidth,$frmHight,-1,-1,$WS_SIZEBOX,-1)

 

Resize Components:

GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP))

 

 

GUI einblenden:        

       GUISetState(@SW_SHOW, $frmGUI)

 

GUI ausblenden:        

       GUISetState(@SW_HIDE, $frmGUI)

 

GUI aktivieren:        

       GUISetState(@SW_ENABLE , $frmGUI)

 

GUI deaktivieren:        

       GUISetState(@SW_DISABLE , $frmGUI)

 

 

DLLs mit FreeBasic

Dll erstellen und mit AutoIt nutzen – FreeBasic Tutorial

Ich hab hier mal ein rudimentäres Tutorial zusammengeklopft, welches zeigen soll, wie man in FreeBasic eine Dll für AutoIt erstellt.

 

Dieses Tutorial richtet sich in erster Linie an all diejenigen, die mit AutoIt begonnen haben zu programmieren und nun so langsam an die Geschwindigkeitsgrenze von AutoIt stoßen.

 

Ich habe mich für FreeBasic entschieden, weil es Free ist, eine ähnliche Syntax wie AutoIt hat, sehr klein und ohne unnötige Extras daherkommt und bei zahlreichen Tests kleinere und schnellere Dll´s gezaubert hat als andere Compiler.

Wer AutoIt beherscht sollte damit relativ leicht zurechtkommen!

 

 

 

Einrichten von FreeBasic:

 

Zunächst benötigen wir den Compiler, welcher u.a. hier zu finden ist: http://www.freebasic-portal.de/downloads…indows-199.html

Als Editor verwende ich FBEdit: http://www.freebasic-portal.de/downloads…dit-ide-30.html

 

EDIT: Dank BugFix kann man nun auch SciTE als Editor verwenden: FreeBasic läßt sich auch rudimentär in SciTE einbinden

 

 

1) FreeBasic installieren:

Einfach FreeBASIC-0.23.0-win32.exe ausführen und den Anweisungen folgen

 

2) FBEdit.zip in den FreeBasic-Ordner enpacken (z.B.: C:\Programme\FreeBASIC\FbEdit)

 

3) FBEdit starten:

Beim ersten Start muss man die Pfade eingeben:

Compiler Path: C:\Programme\FreeBASIC

Help Path: C:\Programme\FreeBASIC\FbEdit\Help

 

Activate FbEdit Lite for beginners mit "Nein" beantworten.

 

4) Hilfe einrichten:

Um die Hilfe in FbEdit benutzen zu können, muss noch das hier geladen werden: http://www.freebasic-portal.de/downloads…0-23-0-198.html

Nach dem Entpacken in FB.chm umbenennen und in den Hilfe-Ordner kopieren.

Ich selber habe noch "win32.hlp" im Hilfe-Ordner liegen

Diese 4 Hilfen (FB.chm, FbEdit.chm, Windows_Styles.chm u win32.hlp) sind standartmässig bereits eingetragen und können via Options-Help Menu editiert werden

 

 

 

Erstellen einer DLL:

 

1) FbEdit starten

2) File – New Project

3) Project Name und Description eingeben

4) "Project Type" = "Windows dll" auswählen und OK klicken

 

5) Folgenden Code ins Editorfenster eintippen:

 

Code kopieren

Quellcode

1

2

3

4

5

6

7

 

Extern "Windows-MS"

 

Function _Add(iX As Integer, iY As Integer)As Integer Export

Return iX + iY

End Function

 

End Extern

 

6) Make – Compile im Menü aufrufen oder F5 drücken

Fertig ist die erste Dll

 

Zum testen benötigen wir noch ein AutoIt-Script:

AutoIt-QuellcodeCode kopieren

1

2

3

 

$hDll = DllOpen("Add.dll")

$aResult = DllCall($hDll, "int", "_Add", "int", 1234, "int", 1234)

ConsoleWrite("Ergebnis = " & $aResult[0] & @CRLF)

 

 

Kurze Beschreibung der DLL:

Funktionen, welche man mit AutoIt aufrufen möchte, sollten zwischen <Extern "Windows-MS"> und <End Extern> stehen

Dadurch kann man die Funktionen dann mit demselben Namen aufrufen, wie er im Editor auch angegeben ist.

Andernfalls müsste man bei DllCall "_ADD@8" schreiben, und sollte man 3 Parameter übergeben dann: "_ADD@12", bei 4 "_ADD@16" usw…

 

Die Funktion selber sollte eigentlich selbserklärend sein.

Für jeden Parameter und auch den Rückgabewert muss man einen Datentyp angeben (As Integer)

Das "Export" am Ende der Zeile macht die Funktion "nach aussen hin sichtbar" und muss nur für Funktionen angegeben werden, welche man direkt via AutoIt aufrufen möchte.

 

 

 

Parameter können auch ByRef übergeben werden.

Das funktioniert ungefähr so:

 

QuellcodeCode kopieren

1

2

3

4

5

6

7

 

Extern "Windows-MS"

 

Sub _ByRef(iX As Integer, iY As Integer, ByRef iZ As Integer) Export

iZ = iX + iY

End Sub

 

End Extern

 

 

 

 

AutoIt-QuellcodeCode kopieren

1

2

3

 

$hDll = DllOpen("ByRef.dll")

$aResult = DllCall($hDll, "none", "_ByRef", "int", 1234, "int", 1234, "int*", 0)

ConsoleWrite("+ Ergebnis = " & $aResult[3] & @CRLF)

 

 

 

 

 

Hier noch ein kurzes Beispiel, wie man den Inlineassembler von FreeBasic benutzt:

 

QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

 

Extern "Windows-MS"

 

Function _ASM_ADD(iX As Integer, iY As Integer)As Integer Export

Dim As Integer iZ

Asm

mov eax, [iX]

mov ebx, [iY]

Add eax, ebx

mov [iZ], eax

End Asm

Return iZ

End Function

 

End Extern

 

 

 

AutoIt-QuellcodeCode kopieren

1

2

3

 

$hDll = DllOpen("ASM.dll")

$aResult = DllCall($hDll, "int", "_ASM_ADD", "int", 1234, "int", 1234)

ConsoleWrite("+ Ergebnis = " & $aResult[0] & @CRLF)

 

 

 

 

 

Verwenden von Arrays:

Um eine große Anzahl von Daten an die Dll zu übergeben bzw. zu erhalten, erstellt man in AutoIt zunächst eine DllStruct und deren Pointer wird an die Dll übergeben.

 

Beispiel:

2 Arrays vom Typ integer und Singlefloat mit jeweils 100 Einträgen werden benötigt:

In AutoIt erstellt man nun eine DllStruct:

AutoIt-QuellcodeCode kopieren

1

 

$tStruct = DllStructCreate("int X[100]; float Y[100];")

 

In FreeBasic muss man zunächst einen Type definieren, damit der Compiler weiß wie die Daten im Speicher liegen:

QuellcodeCode kopieren

1

2

3

4

5

6

 

Type t_Struct

X(1 To 100) As Integer

Y(0 To 99) As Single

End Type

 

Sub _Test(pStruct As t_Struct Ptr)

 

(Hier kann man je nach belieben 1-100 oder 0-99 verwenden)

 

Der Parameter heisst hier pStruct und ist ein Pointer zu einem Speicherbereich in welchem die Daten lt. t_Struct liegen.

 

Wie man nun damit arbeitet, soll folgendes Beispiel zeigen:

 

QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

 

Type t_CircleData

iMX As Integer

iMY As Integer

aX(0 To 359) As Single

aY(0 To 359) As Single

End Type

 

Public Const Pi = 3.14159265358979

Public Const Deg2Rad = Pi / 180

 

Extern "Windows-MS"

 

Sub _Circle(iX As Integer, iY As Integer, iR As Integer, tCirlce As t_CircleData Ptr) Export

Dim As Single fRad

 

For i As UInteger = 0 To 359

fRad = i * Deg2Rad

tCirlce->aX(i) = Cos(fRad) * iR + iX

tCirlce->aY(i) = Sin(fRad) * iR + iY

Next

 

tCirlce->iMX = iX

tCirlce->iMY = iY

End Sub

 

End Extern

 

 

 

AutoIt-QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

 

$tCircle = DllStructCreate("int iMX; int iMY; float aX[360]; float aY[360];")

$pCircle = DllStructGetPtr($tCircle)

 

$hDll = DllOpen("Array.dll")

DllCall($hDll, "none", "_Circle", "int", 400, "int", 400, "int", 180, "ptr", $pCircle)

 

For $i=1 To 360

   $iX = DllStructGetData($tCircle, "aX", $i)

   $iY = DllStructGetData($tCircle, "aY", $i)

   MouseMove($iX, $iY, 1)

   ConsoleWrite($iX & " " & $iY & @CRLF)

Next

 

 

 

 

Am Schluss noch ein paar Infos:

Wenn man die Datei mit der Endung .fbp mit einem normalen Text-Editor öffnet, dann kann man die Compileroptionen verändern:

Die Zeile sieht in unseren Beispielen so aus:

1=Windows dll,fbc -s gui -dll -export

Wir fügen nun -R hinzu:

1=Windows dll,fbc -s gui -dll -export -R

Wenn wir die Datei nun mit FbEdit öffnen und neu kompilieren, dann entsteht eine neue Datei mit der Endung .asm

Darin finden wir unsere Funktionen als Assembler Code und das kann manchmal ganz nützlich sein.

 

Die Parameter -fpmode FAST -fpu SSE legen in bestimmten Fällen noch den Turbo ein.

Wenn die Dll fertig ist, dann am besten 2mal komiplieren, einmal ohne und einmal mit diesen Parametern; und überprüfen welche Version schneller ist ;)

(bei einer meinen Tests konnte ich so eine Funktion von etwa 600ms auf 450ms beschleunigen)

 

 

 

Das wars für´s Erste mal…

Bei Interesse an weiteren, spezielleren Beispielen (z.B.: Bildbearbeitung) einfach melden.

 

Im Anhang sind noch alle obigen Beispiele als Quallcode und comiliert

 

 

 

EDIT 1

Hier zwei Beispiele für Fortgeschrittene:

 

Anhand eines einfachen Greyscale-Algorithmuses zeige ich hier, wie man in FreeBasic Multithreading realisiert:

 

GreyScale.bas:

 

QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

 

Type t_Param

pPixelData As UInteger Ptr

iPixelCnt As Integer

End Type

 

 

Sub _GreyScaleFunc(pParam As t_Param Ptr)

Dim As UByte Ptr pARGB

Dim As UByte iLuma

 

For i As UInteger = 0 To pParam->iPixelCnt -1

pARGB = @pParam->pPixelData[i]

 

'Luma = BlauAnteil * 0.11 + GrünAnteil * 0.59 + RotAnteil * 0.3

iLuma = (pARGB[0] * 0.11) + (pARGB[1] * 0.59) + (pARGB[2] * 0.3)

 

pARGB[0] = iLuma

pARGB[1] = iLuma

pARGB[2] = iLuma

Next

 

End Sub

 

 

Extern "Windows-MS"

 

Sub _GreyScale(pPixelData As UInteger Ptr, iPixelCnt As Integer) Export

Dim As t_Param tParam(0 To 3)

Dim As Integer iPixel_4 = iPixelCnt / 4

 

'Einer Threadfunktion kann man nur einen Pointer übergeben, deshalb erstellen wir 4 Variablen vom Typ t_Param und befüllen diese mit den entsprechenden Werten

For i As UInteger = 0 To 3

tParam(i).pPixelData = pPixelData + (iPixel_4 * i) ' Startposition des ersten zu berechnenden Pixels

tParam(i).iPixelCnt = iPixel_4 ' Anzahl der Pixel pro Thread

Next

 

Dim As Any Ptr pThread(0 To 3)

For i As Integer = 0 To 3

If i = 2 Then Continue For ' zu Testzwecken: 3 Thread überspringen

pThread(i) = ThreadCreate(@_GreyScaleFunc, @tParam(i)) 'starte Threads

Next

 

For i As Integer = 0 To 3

ThreadWait(pThread(i)) 'warten bis alle Threads fertig

Next

 

End Sub

 

End Extern

 

Und das dazugehörige AutoIt Script zum Testen:

 

AutoIt-QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

 

#include <GDIPlus.au3>

#AutoIt3Wrapper_UseX64=n

 

Global $sPath = FileOpenDialog("open image", "", "(*.jpg;*.bmp;*.png;*.tif;*.gif)")

If @error Or Not FileExists($sPath) Then Exit

 

_GDIPlus_Startup()

 

Global $hImage = _GDIPlus_ImageLoadFromFile($sPath)

Global $aData = _CreatePixelData($hImage)

_GDIPlus_ImageDispose($hImage)

 

 

Global $hDll = DllOpen(@ScriptDir & "\GreyScale.dll")

Global $iTimer = TimerInit()

DllCall($hDll, "none", "_GreyScale", "ptr", $aData[0], "int", $aData[3] * $aData[4])

Global $iTime = TimerDiff($iTimer)

ConsoleWrite(@error & " " & @extended & @CRLF)

 

_GDIPlus_ImageSaveToFile($aData[2], @ScriptDir & "\GreyScale.bmp")

 

_DisposePixelData($aData)

_GDIPlus_Shutdown()

DllClose($hDll)

 

MsgBox(0, "Fertig", "GreyScale fertig in : " & Round($iTime, 3) & "ms" & @CRLF & " 3 Thread wurde übersprungen, deshalb ist das fertige Bild nicht komplett im Grauton!")

ShellExecute(@ScriptDir & "\GreyScale.bmp")

 

 

 

 

 

Func _CreatePixelData($hImage)

   Local $iImgW = _GDIPlus_ImageGetWidth($hImage)

   Local $iImgH = _GDIPlus_ImageGetHeight($hImage)

 

   Local $tPixelData = DllStructCreate("uint[" & $iImgW * $iImgH & "];")

 

   Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iImgW, "int", $iImgH, "int", $iImgW * 4, "int", 0x0026200A, "ptr", DllStructGetPtr($tPixelData), "int*", 0)

   If @error Then Return SetError(1, 1, False)

   Local $hBitmap = $aResult[6]

 

   Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

   _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iImgW, $iImgH)

   _GDIPlus_GraphicsDispose($hContext)

 

   Local $aReturn[5]

   $aReturn[0] = DllStructGetPtr($tPixelData)

   $aReturn[1] = $tPixelData

   $aReturn[2] = $hBitmap

   $aReturn[3] = $iImgW

   $aReturn[4] = $iImgH

 

   Return $aReturn

EndFunc   ;==>_CreatePixelData

 

 

Func _DisposePixelData(ByRef $aData)

   If Not IsArray($aData) Then Return

   _GDIPlus_BitmapDispose($aData[2])

   $aData[1] = 0

   $aData = 0

EndFunc   ;==>_DisposePixelData

 

 

 

Hier derselbe Algo, allerdings in Assembler:

 

QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

 

Sub ASM_GREYSCALE(iAddr As UInteger, iPixels As UInteger)

 

Dim As UInteger iCnt, iMod

iMod = iPixels Mod 4

iCnt = iPixels – iMod

 

Asm

jmp .GS_Start

 

.align 16

_GS_11: .float 0.11, 0.11, 0.11, 0.11

_GS_59: .float 0.59, 0.59, 0.59, 0.59

_GS_3: .float 0.3, 0.3, 0.3, 0.3

_GS_Blue: .long 255, 255, 255, 255

 

.GS_Start:

mov edi,dword[iAddr]             'Startadress Bitmapdata (Pixel)

mov ecx,dword[iCnt]           'number of Pixel

 

movaps xmm7, [_GS_11]

movaps xmm6, [_GS_59]

movaps xmm5, [_GS_3]

movaps xmm4, [_GS_Blue]

 

  .align 16

.GS_Loop:'until ecx=0

 

movdqu xmm0,[edi]'load 4 pixels to xmm0

movdqa xmm3, xmm0'Pixels to xmm3

Pand xmm3, xmm4'And 000000FF

cvtdq2ps xmm3, xmm3'Int To Float

 

movdqa xmm2, xmm0'Pixels to xmm2

PSRLD xmm2, 8'Green

Pand xmm2, xmm4'And 000000FF

cvtdq2ps xmm2, xmm2'Int To Float

 

movdqa xmm1, xmm0'Pixels to xmm1

PSRLD xmm1, 16'Red

Pand xmm1, xmm4'And 000000FF

cvtdq2ps xmm1, xmm1'Int To Float

 

PSRLD xmm0, 24'Alpha

'Pand xmm0, xmm4'And 000000FF

PSLLD xmm0, 24'Alpha

 

'7=0.11 6=0.59 5=0.3 4=BlueMask 3=Blue 2=Green 1=Red 0=Alpha

mulps xmm3, xmm5'Blue * 0.11

mulps xmm2, xmm6'Green * 0.59

mulps xmm1, xmm7'Red * 0.3

 

addps xmm3, xmm2'Blue + Green

addps xmm3, xmm1'BlueGreen + Red

CVTPS2DQ xmm3, xmm3'float to int

Pand xmm3, xmm4'And 000000FF

 

movdqa xmm2, xmm3

PSLLD xmm2, 8

por xmm3, xmm2'Luma to 0000FF00

 

movdqa xmm1, xmm3

PSLLD xmm1, 16

por xmm3, xmm1'Luma to 00FF0000

 

por xmm3, xmm0'Alpha to FF000000

 

 

movdqu [edi], xmm3'write 4 pixels

 

Add edi,16                           'address next pixel: 4 Byte = 1 dword = 1 Pixel

Sub ecx,4                           'counter (next pixel)

 

ja .GS_Loop                              'until ecx=0

 

mov eax, [iMod]'Falls Pixelanzahl nicht durch 4 teilbar, dann hier restliche Pixel berechnen:

cmp eax, 0

je .GS_End

shl eax, 2'mal 4

Add edi, eax'letzter Pixel

Sub edi, 16'minus 4 Pixel

Xor eax, eax'Reset

mov [iMod], eax'Reset iMod

jmp .GS_Loop'Nochmals Loop für die letzten 4 Pixel (evtl. werden Pixel doppelt berechnet, aber der Geschwindigkeitsvorteil überwiegt)

 

.GS_End:

 

End Asm

 

End Sub

 

 

Extern "Windows-MS"

 

Sub _GreyScale(pPixelData As UInteger Ptr, iPixelCnt As Integer) Export

ASM_GREYSCALE(pPixelData, iPixelCnt)

End Sub

 

End Extern

 

AutoIt-QuellcodeCode kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

 

#include <GDIPlus.au3>

 

Global $sPath = FileOpenDialog("open image", "", "(*.jpg;*.bmp;*.png;*.tif;*.gif)")

If @error Or Not FileExists($sPath) Then Exit

 

_GDIPlus_Startup()

 

Global $hImage = _GDIPlus_ImageLoadFromFile($sPath)

Global $aData = _CreatePixelData($hImage)

_GDIPlus_ImageDispose($hImage)

 

 

Global $hDll = DllOpen(@ScriptDir & "\GreyScale.dll")

Global $iTimer = TimerInit()

DllCall($hDll, "none", "_GreyScale", "ptr", $aData[0], "int", $aData[3] * $aData[4])

Global $iTime = TimerDiff($iTimer)

ConsoleWrite(@error & " " & @extended & @CRLF)

 

_GDIPlus_ImageSaveToFile($aData[2], @ScriptDir & "\GreyScale.bmp")

 

_DisposePixelData($aData)

_GDIPlus_Shutdown()

DllClose($hDll)

 

MsgBox(0, "Fertig", "GreyScale fertig in : " & Round($iTime, 3) & "ms")

ShellExecute(@ScriptDir & "\GreyScale.bmp")

 

 

 

 

 

Func _CreatePixelData($hImage)

   Local $iImgW = _GDIPlus_ImageGetWidth($hImage)

   Local $iImgH = _GDIPlus_ImageGetHeight($hImage)

 

   Local $tPixelData = DllStructCreate("uint[" & $iImgW * $iImgH & "];")

 

   Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iImgW, "int", $iImgH, "int", $iImgW * 4, "int", 0x0026200A, "ptr", DllStructGetPtr($tPixelData), "int*", 0)

   If @error Then Return SetError(1, 1, False)

   Local $hBitmap = $aResult[6]

 

   Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

   _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iImgW, $iImgH)

   _GDIPlus_GraphicsDispose($hContext)

 

   Local $aReturn[5]

   $aReturn[0] = DllStructGetPtr($tPixelData)

   $aReturn[1] = $tPixelData

   $aReturn[2] = $hBitmap

   $aReturn[3] = $iImgW

   $aReturn[4] = $iImgH

 

   Return $aReturn

EndFunc   ;==>_CreatePixelData

 

 

Func _DisposePixelData(ByRef $aData)

   If Not IsArray($aData) Then Return

   _GDIPlus_BitmapDispose($aData[2])

   $aData[1] = 0

   $aData = 0

EndFunc   ;==>_DisposePixelData

 

 

 

 

AD LDAP

Active Directory: LDAP-Feldnamen

Zuletzt aktualisiert: 26. September 2013

 

Wer Active Directory mit ADSI ansprechen will – aber auch, wer etwa mit csvde.exe oder einem anderen Werkzeug einen Text-Export oder -Import ausführen möchte -, muss wissen, unter welchen Feldnamen die Attribute des Verzeichnisses angesprochen werden.

 

Hier findet sich eine Tabelle der wichtigsten Attribute für die wichtigsten Objektklassen (Stand: Windows 2000. Die Feldnamen sind unter Windows 2003 und 2008 noch dieselben,. nur die Bezeichnungen in den Verwaltungstools unterscheiden sich teilweise). Soweit vorhanden, ist dabei angegeben, unter welcher Bezeichnung diese Attribute in der grafischen benutzeroberfläche (Standard-Verwaltungstools von Windows 2000) angezeigt werden. Eine weitere Übersicht dieser Art findet sich unter http://www.reiser-it.net/downloads/ad_attribute.xls.

 

 

Klasse

Anzeige

LDAP

Bemerkung

(allgemein)

Definierter Name

distinguishedName

 

(allgemein)

Common-Name

cn

 

(allgemein)

Objektklasse

objectClass

 

(allgemein)

Original-USN

uSNChanged

 

(allgemein)

Aktuelle USN

uSNCreated

 

(allgemein)

Erstellt am

whenChanged

 

(allgemein)

Geändert am

whenCreated

 

user

Vorname

givenName

 

user

Nachname

sn

 

user

Anzeigename

displayName

Achtung: Dieses Attribut wird nicht genutzt, um das Objekt in den AD-Verwaltungstools anzuzeigen. Dafür benutzt man die Objekteigenschaft "name", die vom Feld "distinguishedName" abgeleitet ist.

user

Beschreibung

description

 

user

Büro

physicalDeliveryOfficeName

 

user

Rufnummer

telephoneNumber

 

user

E-Mail

mail

WIrd u. a. von Exchange 2000 automatisch mit der Standard-Mailadresse gefüllt.

user

Webseite

wwwHomePage

 

user

Benutzeranmeldename

userPrincipalName

 

user

Benutzeranmeldename NT

samAccountName

 

user

Anmeldezeiten

logonHours

 

user

Anmelden

userWorkstations

 

user

Kontooptionen

userAccountControl

512=aktiviert; 514=deaktiviert; 66048=Kennwort läuft nie ab; weitere Optionen indirekt!

user

(Muss Kennwort ändern)

pwdLastSet

auf 0 setzen, wenn KW geändert werden muss; auf -1 setzen, um Option abzuschalten

user

Ablaufdatum des Kontos

accountExpires

 

user

Profilpfad

profilePath

 

user

Anmeldeskript

scriptPath

 

user

Basisordner

homeDirectory

 

user

Ordner freigegebener Dokumente

userSharedFolder

 

user

E-Mail-Adressen

proxyAddresses

Multi-Valued; zählt Mail-Adressen auf (SMTP, X.400 usw.)

user

(In Adresslisten anzeigen)

showInAddressBook

Gibt Adressbücher an, in denen Empf. Steht

user

Nicht in Exchange-Adresslisten anzeigen

msExchHideFromAddressLists

 

user

(Exchange-Homeserver)

msExchHomeServerName

 

user

Alias

mailNickname

 

user

(IM-Adresse)

msExchIMAddress

 

user

(IM-Homeserver)

msExchIMVirtualServer

 

user

Straße

streetAddress

 

user

Postfach

postOfficeBox

 

user

Stadt

l

 

user

Bundesland/Kanton

st

 

user

PLZ

postalCode

 

user

Land/Region

countryCode

 

user

Anrede (W2000)

Position (WS2003)

title

Die angezeigte Bezeichnung ist im deutschen Adminpak von WS2003 geändert worden.

user

Abteilung

department

 

user

Firma

company

 

user

Vorgesetzte(r)

manager

 

user

Mitarbeiter

directReports

 

user

Privat

homePhone

 

user

Funkruf

pager

 

user

Mobil

mobile

 

user

Fax

facsimileTelephoneNumber

 

user

IP-Telefon

ipPhone

 

user

Anmerkung

info (note)

 

user

Mitglied von

memberOf

Dieses Feld ist ein sog. "Backlink", ist also nur zum Lesen geeignet. Es wird zur Abfragezeit berechnet. Vgl. die FAQ zum Thema.

user

Letzte Anmeldung

lastLogon

 

user

Letzte Abmeldung

lastLogoff

 

contact

Vorname

givenName

 

contact

Nachname

sn

 

contact

Anzeigename

name

 

contact

Beschreibung

description

 

contact

Büro

physicalDeliveryOfficeName

 

contact

Rufnummer

telephoneNumber

 

contact

E-Mail

mail

 

contact

E-Mail-Adressen

proxyAddresses

Multi-Valued; zählt Mail-Adressen auf (SMTP, X.400 usw.)

contact

(In Adresslisten anzeigen)

showInAddressBook

Gibt Adressbücher an, in denen Empf. Steht

contact

Nicht in Exchange-Adresslisten anzeigen

msExchHideFromAddressLists

 

contact

Alias

mailNickname

 

contact

Webseite

wwwHomePage

 

contact

Straße

streetAddress

 

contact

Postfach

postOfficeBox

 

contact

Stadt

l

 

contact

Bundesland/Kanton

st

 

contact

PLZ

postalCode

 

contact

Land/Region

countryCode

 

contact

Anrede

title

 

contact

Abteilung

department

 

contact

Firma

company

 

contact

Vorgesetzte(r)

manager

 

contact

Mitarbeiter

directReports

 

contact

Privat

homePhone

 

contact

Funkruf

pager

 

contact

Mobil

mobile

 

contact

Fax

facsimileTelephoneNumber

 

contact

IP-Telefon

ipPhone

 

contact

Anmerkung

info

 

contact

Mitglied von

memberOf

Dieses Feld ist ein sog. "Backlink", ist also nur zum Lesen geeignet. Es wird zur Abfragezeit berechnet. Vgl. die FAQ zum Thema.

computer

Computername (NT)

sAMAccountName

 

computer

Beschreibung

description

 

computer

Mitglied von

memberOf

Dieses Feld ist ein sog. "Backlink", ist also nur zum Lesen geeignet. Es wird zur Abfragezeit berechnet. Vgl. die FAQ zum Thema.

computer

Standort

location

 

computer

verwaltet von

managedBy

 

computer

Betriebssystem

operatingSystem

 

computer

Betriebssystemversion

operatingSystemVersion

 

computer

Letzte Anmeldung

lastLogon

 

computer

Letzte Abmeldung

lastLogoff

 

group

Gruppenname (NT)

sAMAccountName

 

group

Beschreibung

description

 

group

E-Mail

mail

 

group

Gruppenbereich/-typ

groupType

 

group

Anmerkung

info

 

group

Mitglieder

member

Multi-Valued

group

Mitglied von

memberOf

Dieses Feld ist ein sog. "Backlink", ist also nur zum Lesen geeignet. Es wird zur Abfragezeit berechnet. Vgl. die FAQ zum Thema.

group

verwaltet von

managedBy

 

group

E-Mail-Adressen

proxyAddresses

Multi-Valued; zählt Mail-Adressen auf (SMTP, X.400 usw.)

group

(In Adresslisten anzeigen)

showInAddressBook

Gibt Adressbücher an, in denen Empf. Steht

group

Nicht in Exchange-Adresslisten anzeigen

msExchHideFromAddressLists

 

group

Alias

mailNickname

 

organizationalUnit

Name

name

 

organizationalUnit

Beschreibung

description

 

organizationalUnit

GPO-Link

gPLink

Multi-Valued; gibt gelinkte GPOs an (per GUID)

printQueue

Name

name

 

printQueue

Beschreibung

description

 

printQueue

Druckfreigabe

printShareName

 

volume

Name

name

 

volume

Beschreibung

description

 

volume

Freigabe

uncName

 

volume

Schlüsselwörter

keyWords

Multi-Valued

groupPolicyContainer

Name

name

 

groupPolicyContainer

Anzeigename

displayName

 

groupPolicyContainer

Versionsnummer

versionNumber

 

groupPolicyContainer

Physischer Pfad

gPCFileSysPath

 

groupPolicyContainer

gPCFunctionalityVersion

gPCFunctionalityVersion

 

groupPolicyContainer

gPCMachineExtensionNames

gPCMachineExtensionNames

 

groupPolicyContainer

gPCUserExtensionNames

gPCUserExtensionNames

 

 

Rückgabewert vom AD: -2147467259        keine Berechtigung für diese Aktion

 

 

autoit Syntax ZIP Archiv

#include <zip.au3>

 

Create Zipfile:

       $hZipFile = _Zip_Create($sZipFilePath)

 

Add Files to Zip-Archive:

       _Zip_AddFile($hZipFile, @ScriptDir & "\" & $sFileName, 1)

 

Unzip ZipArchive:

       _Zip_UnzipAll($PathCurrent & $ZipFile, $UnzipPath, 0) ; FullPathSource, FullPathTargetDir, flag 0: Show Progress, 1: do not

 


 

Lösung mit 7zip

 

FileInstall("7z.exe","C:\Temp\unzip\",0)

FileInstall("7z.dll","C:\Temp\unzip\",0)

 

$UnzipResult = _Unzip($LogFile)

       _LogWrite($LogFile,@ScriptLineNumber," – UnzipResult: " & $UnzipResult[0] & “ : “ & $UnzipResult[1],$Debug,@error,$WaitTime)

 

Func _Unzip($hLogFile,$TargetDir = @ScriptDir)

;~ Func _Unzip($hLogFile,$TargetDir = @ScriptDir)

;        Parameters:        $hLogFile:        Handle der Logdatei vom aufrufenden Programm

;                                $TargetDir:        Zielverzeichnis, Default = aktuelles Verzeichnis

;        Voraussetzungen:        7z.exe und 7z.dll müssen im aktuellen Verzeichnis liegen

;        Rückgabe:        $Result                1: Erfolg

;                                                        0: Fehler und @error <> 0

;                                                        @error        0:        kein Fehler

;                                                                        1:        7z.exe nicht gefunden

;                                                                        2:        7z.dll nicht gefunden

;                                                                        3:        Archiv nicht gefunden

;                                                                        4:        ZielPfad konnte nicht erstellt werden

;                                                                        5:        $ZipDir konnte nicht erstellt werden

; Definitionen ——————-

FileWriteLine($hLogFile," _Unzip > ———- START of Function ———- ")

       FileWriteLine($hLogFile," _Unzip > ——————————— ")

       FileWriteLine($hLogFile," _Unzip > $TargetDir: " & $TargetDir)

       FileWriteLine($hLogFile," _Unzip > ——————————— ")

       Local $ErrText  = ""

       Local $ErrorCode

       Local $Error[2]

       Local $ZipDir        = "C:\Temp\unzip\"

       Local $ErrText0 = "kein Fehler"

       Local $ErrText1 = $ZipDir & "\7z.exe nicht gefunden"

       Local $ErrText2 = $ZipDir & "\7z.dll nicht gefunden"

       Local $ErrText3 = "Archiv nicht gefunden"

       Local $ErrText4 = "ZielPfad konnte nicht erstellt werden"

       Local $ErrText5 = "$ZipDir konnte nicht erstellt werden"

 

;~        FileWriteLine($hLogFile," _Unzip > $ZipDir: " & $ZipDir & "   Err: " & @error)

 

       if not FileExists($ZipDir & "7z.exe") then

               FileWriteLine($hLogFile," _Unzip > 7z.exe nicht gefunden… ")

               SetError(1)

               $ErrText = $ErrText & @CRLF & "Err 1: " & $ErrText1

       EndIf

 

       if not FileExists($ZipDir & "7z.dll") then

               FileWriteLine($hLogFile," _Unzip > 7z.dll nicht gefunden… ")

               SetError(2)

               $ErrText = $ErrText & @CRLF & "Err 2: " & $ErrText2

       EndIf

 

       if not FileExists($TargetDir) then

               FileWriteLine($hLogFile," _Unzip > ZielPfad: " & '"' & $TargetDir & '"')

               FileWriteLine($hLogFile," _Unzip > ZielPfad nicht gefunden… ")

               DirCreate($TargetDir)

               FileWriteLine($hLogFile," _Unzip > versuchte, ZielPfad zu erstellen… ")

               Sleep(500)

               if not FileExists($TargetDir) Then

                       FileWriteLine($hLogFile," _Unzip > ZielPfad konnte nicht erstellt werden… ")

                       SetError(4)

                       $ErrText = $ErrText & @CRLF & "Err 4: " & $ErrText4

               EndIf

       EndIf

 

  Local $hSearch = FileFindFirstFile(@ScriptDir & "\*.zip")

   If $hSearch = -1 Then

;~    ;     MsgBox($MB_SYSTEMMODAL, "", "Error: No files/directories matched the search pattern: *.zip")

               FileWriteLine($hLogFile," _Unzip > Error: No files/directories matched the search pattern: *.zip")

               SetError(3)

                       $ErrText = $ErrText & @CRLF & "Err 3: " & $ErrText3

       Return False

   EndIf

       Local $sFileName = "", $iResult = 0

       While 1

       $sFileName = FileFindNextFile($hSearch)

       ; If there is no more file matching the search.

       If @error Then ExitLoop

;~    ;

       ; unzip the file…

       $UnzipExe        = $ZipDir  & "7z.exe x -aoa "

               $CurrDir        = '"' & @ScriptDir & '"'

;~    ;        $UnzipCmd = "cmd.exe /c " & $UnzipExe & $Archive & " -o" & $TargetDir & " & Pause"

               $UnzipCmd = "cmd.exe /c " & $UnzipExe & $sFileName & " -o" & '"' & $TargetDir & '"'

;~    ;

               FileWriteLine($hLogFile," _Unzip > $UnzipExe: " & $UnzipExe)

               FileWriteLine($hLogFile," _Unzip > $CurrDir:  " & $CurrDir)

               FileWriteLine($hLogFile," _Unzip > $TargetDir:" & '"' & $TargetDir & '"')

               FileWriteLine($hLogFile," _Unzip > $UnzipCmd: " & $UnzipCmd)

;~    ;

               $UnzipResult = runwait($UnzipCmd)

               $ErrorCode = @error

               Sleep(1000)

;~    ;

               FileWriteLine($hLogFile," _Unzip > — UnzipResult: " & $UnzipResult)

               FileWriteLine($hLogFile," _Unzip > — Unzip-Error: " & $Error)

   WEnd

 

   FileClose($hSearch)

 

       $Error[0] = @error

       $Error[1] = $ErrText

       FileWriteLine($hLogFile," _Unzip > ———- End of Function ———- ")

 

       Return $Error

EndFunc        ;        _Unzip()

 

 

 

autoit Syntax WMI

Beispiel für eine WMI-Abfrage:

 

$BootTime = BootTime()

 

MsgBox(0,"Info","BootTime: " & $BootTime & @CRLF & @CRLF & "(dieses Fenster schließt nach 10 Sekunden…)" ,10)

 

EXIT

 

Func BootTime()

   $COMPUTERNAME=@computername

   Local $ProductCode, $ProductName, $Val

   Local $objItems

   Local $objWMI

 

   $wbemFlagReturnImmediately = 0x10

   $wbemFlagForwardOnly = 0x20

 

   $objWMI = ObjGet("winmgmts:\\" & $COMPUTERNAME & "\root\CIMV2")

   $objItems = $objWMI.ExecQuery('Select * from Win32_OperatingSystem', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

   If IsObj($objItems) Then

       For $objItem In $objItems

           $oBootTime        = $objItem.LastBootUptime

       Next

   EndIf

   $BootTimeArray=StringSplit($oBootTime,".",1) ; Entferne alle Zahlen nach dem . damit es in der Console schöner aussieht.

   $BootTime=$BootTimeArray[1]; Gib mir den Teil des Arrays links vom . (Punkt)

; $StartTime = StringRegExpReplace($BootTime, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})","$4:$5:$6 $3.$2.$1")

$StartTime = StringRegExpReplace($BootTime, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})","$3.$2.$1 – $4:$5")

return($StartTime)

EndFunc

autoit Syntax Win7 – UAC

Um das Programm mit erhöhlten Admin-Rechten auszuführen,
folgende Zeile einfügen:

 

#RequireAdmin

 

dim $uac_OFF = 0

dim $uac_ON = 1

 

; disable UAC

Local $uac_saved = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA")

msgbox(0,"–INFO–", "UAC-RegKey ist: " & @TAB & $uac_saved)

#RequireAdmin

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", $uac_OFF)

Local $uac = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA")

msgbox(0,"–INFO–", "After disabling UAC-RegKey ist: " & @TAB & $uac)

 

 

; enable UAC

Local $uac_saved = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA")

msgbox(0,"–INFO–", "UAC-RegKey ist: " & @TAB & $uac_saved)

#RequireAdmin

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", $uac_ON)

Local $uac = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA")

msgbox(0,"–INFO–", "After ensabling UAC-RegKey ist: " & @TAB & $uac)

 

 

autoit Syntax User SID

Get Username out of SID:

 

#include <Security.au3>

 

Local $vSID = "S-1-5-21-4148424496-1016001814-1247282737-109342"

 

 

$aUserAccount = _Security__LookupAccountSid ($vSID)

 

       If IsArray($aUserAccount) then

               MsgBox(0,"User","AccountName: " & @TAB & $aUserAccount[0] _

               & @CRLF & "DomainName: " & @TAB & $aUserAccount[1] _

               & @CRLF & "SID type: " & @TAB & $aUserAccount[2] _

               & @CRLF & "@error: " & @TAB & @error)

       Else

               MsgBox(0,"User","$aUserAccount enthält kein Array… " _

               & @CRLF & "@error: " & @TAB & @error)

       EndIf

 

Exit