Die Datei darfst frei verwendet werden, sie ist OpenSource und unterliegt der GNU General Public License (GPL).
Es ist aber geschickter auf das Original zu verlinken im Paket "cdrtools", Download Seite.
Beiträge von BugFix
-
-
Ich denke, die meisten deklarieren Variablen, wenn sie nicht innerhalb einer Funktion sind, als Global.
Nun habe ich von Valik (EN-Forum) einen interessanten Beitrag zu diesem Thema gefunden, den ihr euch mal zu Gemüte führen solltet.
Ich habe eine Übersetzung gemacht und hoffe, dass ich das Wesentliche getroffen habe. Falls ihr fehlerhafte Inhalte findet - bitte melden. (Besonders bei den umgangssprachlichen Einlagen hab ich mich etwas schwer getan). Einen Text 1:1 übersetzen ist, wie ihr von der Hilfe-Übersetzung wisst, nicht so easy und es ist besser, wenn nochmal wer querliest.
Im Text ist ein Link enthalten, dessen Inhalt ich aber nicht extra übersetzt habe.[Valik] Why Global variables are bad
Übersetzung
Globale Variablen können zu unerwarteten Ergebnissen führen, s. hier. Ich war dabei ein Problem mit AutoIt und Aut2Exe zu fixen, welches beinhaltete, zwei getrennte (und fast identische) Listen von Funktionsnamen zu unterstützen. Habt ihr euch jemals gefragt, warum wir manchmal ein Release ausgeben würden (wie 3.3.5.0), welches nicht eine Funktion kompilieren konnte, aber es konnte laufen? Das ist, weil wir vergaßen, die Aut2Exe zu aktualisieren. Die von mir gezeigte Lösung, löste ein zusätzliches Problem. Es stellte sich heraus, dass in Reihenfolge der Benutzung der Array-Initialisierungs Syntax eine temporäre Lokale Variable erstellt und anschließend in eine 'heap-allocated' Variable kopiert wurde. Ein unangenehmer Leistungserfolg (fast 400 Element-Array mit 16 - 24 Bytes pro Element (32 Bit, 64-Bit-Größen)), der notwendig war, weil jede andere Weise, solch eine massive Struktur zu schaffen, geradezu grotesk sein würde. Ich schrieb den Code um, um statische Klassenmitglieder und die Tatsache auszunutzen, dass sie noch mit der Array-Initialisierungsprogramm-Syntax deklariert werden können. Die Klasse wurde entworfen, um beerbbar zu sein und erforderte nahezu Null Veränderungen zum vorhandenen Code um einfach magisch die vorherige Liste (geschützte Mitglieder mit identischen Namen) zu ersetzen. Alles sah gut aus (und es war gut), bis ich es ausführte. Das Problem war, es stürzte ab. Sehr seltsam. Es stellte sich heraus, dass die globale Klasse die von der neuen Klasse erbte, erstellt wurde und versuchte die Funktionsliste zu verwenden, bevor diese Liste initialisiert wurde. In einer Anwendung, die globale Variablen nicht missbraucht, würde das nie geschehen. Das statische Mitglied würde initialisiert, bevor main() jemals aufgerufen wird, und alles wäre gut. Statische und globale Variablen werden in der Reihenfolge initialisiert in der auf sie getroffen wird. Ich hatte also eine 50-50 Chance, um Glück zu haben, aber ich hatte es nicht. So musste ich die Klasse umschreiben und verwandelte sie in einen Pseudocontainer, um von lokalen statischen Variablen Gebrauch machen zu können. Ich verbrachte viel Zeit, diese Klasse umzuschreiben. Erwähnte ich, dass sie Templates und Makros (zusammen) verwendet? Ja, es ist ein Durcheinander. Der Compiler meckert und du bekommst keine genaue Idee, worin der Fehler besteht, weil er sich über ein hinter einem Makro verborgenes Template-Problem beklagt. Ich schweife ab...
Diese Geschichte schließt auch Aut2Exe ein. Offensichtlich wurde meine Klasse entworfen, um in Aut2Exe ebenso verwendet zu werden, eine einzelne Liste statt zwei Listen zur Verfügung zu stellen. Ich nahm die passenden Änderungen mit Aut2Exe vor, baute sie ein und versuchte es auszuführen. Und es stürzte ab. Dieses Mal betraf es nicht nur meinen Code. Nein, es stellt sich heraus, dass Aut2Exe genau das gleiche Problem hatte, bevor ich jemals darauf stieß. Seit Jahren hat Aut2Exe nur durch eine reine Chance gearbeitet. Ich hatte erwähnt, dass die Chance bei 50-50 liegt? Gut, Aut2Exe hat damit seit Jahren gelebt. Ich habe keine Idee, warum es sich plötzlich dafür entschied zu crashen, als ich an Teilen ohne Beziehung zum Code arbeitete. Es verwirrt mich, warum es entschied, heute Abend war die Nacht, in der es in der Hölle speisen wollte. Aber lieber heute Nacht, wenn das Problem noch frisch ist, als später, wenn ich es wieder vergessen hab.
Das war nicht das erste Mal, dass das beides geschehen ist. Ich habe ziemlich viele globale Variablen von den verschiedenen Tools im Laufe der Jahre entfernt. Ich brauchte ungefähr 25 Minuten, um den Crash nachzuvollziehen, als er heute Abend erstmalig geschah. Es brauchte nur 25 Sekunden bis zum nächsten mal. Ich habe viel Erfahrung mit dem Debugger, der Sprache und mit dem Bug insbesondere, so verschwendete ich nicht Tage mit dem Versuch, es ausfindig zu machen. Ihr könnt nicht dieses Glück haben, wie auch immer. Dies ist ein sehr übler und raffinierter Fehler. Er kann leicht verhindert werden, indem man so wenig wie möglich Globale Variablen verwendet. Klassen definieren, die andere abhängige Objekte richtig als Parameter akzeptieren und Referenzen/Pointer dazu speichern führt zu viel weniger Kopfschmerzen als den bequemen Weg zu nehmen und gemeinsam nutzbare Objekte als Globale Variable zu verwenden. Nehmt euch Zeit, es von Anfang an richtig zu tun, und ihr werdet nicht Stunden verbringen, um bei einem seltsamen Crash einen Fehler zu beseitigen, der aus dem Nirgendwo erscheint, wenn ihr Veränderungen vornehmt, die ohne Beziehung zum Code sind.
Die Quintessenz ist also: Vermeidet/Minimiert Globale Variablen. Hier mal Beispiele, wie man es machen kann:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;===============================================================================
; EDIT: Punkt 1 gestrichen, wie die Diskussion ergeben hat, war dies schlicht unsinnig.
;===============================================================================;============== 2. Vermeidung Globaler Variablen
[/autoit] [autoit][/autoit] [autoit]
#cs
Warum soll ich überhaupt Globale Variablen verwenden? Hier wird meist die Antwort kommen:
'Damit ich den Inhalt in verschiedenen Funktionen nutzen/verändern kann.'
Aber das läßt sich auch anders lösen:
#ceLocal $myVar = 0
[/autoit] [autoit][/autoit] [autoit]_PlusEins($myVar)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('$myVar: ' & $myVar & @CRLF); im Funktionskopf muß nicht der identische Variablenname stehen, erleichtert aber das Lesen
[/autoit]
; die Variable wird der Funktion 'ByRef' übergeben ==> sie kann somit von der Funktion verändert werden
; ohne 'ByRef' erfolgt die Übergabe immer 'ByVar', d.h. eine Kopie der Quellvariable wird erzeugt
Func _PlusEins(ByRef $myVar)
$myVar += 1 ; kein Return erforderlich, da die Variable in ihrer Quelle geändert wird
EndFunc
Sicher kann man sagen: 'Ist mir noch nie passiert, solch Trouble.' Nun halte ich eine 50-50 Chance zum Crash durchaus für eine Größe, die man nicht unter den Tisch kehren sollte. Und es ist wirklich kein großes Problem, sein Programmierverhalten anzupassen und somit diesem Stolperstein von vornherein aus dem Weg zu gehen.
Edit:
Danke für die geführte Diskussion
- hat mir auch einige Punkte etwas näher gebracht und auch die Erkenntnis, dass mein Gedanke, mittels Enumeration von Indexvariablen ein Array zu addressieren, hierfür schlicht blödsinnig ist. 
Allen Lesern dieses Posts möchte ich naheliegen, das Schlußwort von AspirinJunkie unbedingt zu lesen.
-
Warum verwendest du bei wParamType und lParamType statt wParam und lParam int und long ?
-
Ohne den Code zu sehen, ist es nicht möglich darauf zu antworten.
Ich habe auch schon häufiger mit diesen Befehlen gearbeitet aber dieses Verhalten kann ich nicht bestätigen. -
Stimmt, da waren die Finger schneller als der Kopf

-
-
Startwert = 65 = 0%
Endwert = 90 = 100%
==> Differenz = 35
1% = 35/100
Wert 80 = 80-65 = 15*35/100 -
Ich rate mal:
Ein rekursiver Aufruf, der sich totläuft? -
In der Funktion aber statt:
[autoit]Func _ArrayCount($array, $search, $index = 0)
[/autoit]besser:
[autoit]Func _ArrayCount(ByRef $array, $search, $index = 0)
[/autoit]
Das hat den Effekt, dass das Array nicht nochmal kopiert werden muss beim Funktionsaufruf, spart somit Speicher und Zeit. ByRef verwendet man i.A. um einen übergebenen Wert auch in der Quellvariablen verändern zu können aber der Effekt des Speicher-/Zeitsparens ist doch ganz angenehm.
-
[autoit]
$vergleich = 55
[/autoit]
$count = 0
For $i = 0 To UBound($array) -1
If $array[$i] = $vergleich Then $count += 1
Next
ConsoleWrite('Treffer: ' & $count & @CRLF) -
Ich halte es für wenig sinnvoll ein Skript mit einer Laufzeitbegrenzung zu versehen.
Das funktioniert nur, wenn du die Version mit einem hardcodierten Installationsgrenzdatum versiehst. Danach kann man die Version weder installieren noch starten.
Eine Begrenzung in der Form: "Installdatum + Testzeitraum" läßt sich doch spätestens mit einem virtuellen System einfach umgehen.
Man kann natürlich recht verwinkelte Wege gehen um das Installationsdatum zu verstecken und es so dem User zu erschweren das zu manipulieren. Aber dann sollte man darüber nicht in einem offen zugänglichen Forum diskutieren. Da könntest du auch deinen Wohnungsschlüssel verstecken und das Versteck in der Zeitung bekannt geben.
-
denn es gibt einen "Error allocating memory." Fehler aus.
Die Fehlerausgabe teilt dir auch immer mit, von welchem Skript und welcher Skriptzeile der Fehler verursacht wird.
- Ist es die UDF oder dein Skript?
- An welcher Position entsteht der Fehler?Schon mal alle Zeilen auf evtl. Fehlerausgaben geprüft?
(In SciTE kannst du über <Extras> <Trace: Add trace lines> nach jeder Skriptzeile eine Ausgabe des Fehlerwertes in die Console bewirken) -
Da kann man aber viel raten

- wieviel Parameter
- welche Datentypen
...

-
Oder gibt es eine Möglichkeit die Funktionen beliebiger DLLs herauszufinden?
Die Funktionsnamen lassen sich auslesen (Dependency Walker) aber ohne Beschreibung der Parameter kann man die Funktionen nicht anwenden.Und ja, VLC spielt auch Handy-Audio-Format (amr).

-
Ich würde besser den VLC-Player verwenden und über Kommandozeile steuern.
-
[autoit]
$PID = Run('Programm')
[/autoit]
SplashTextOn('....')
While ProcessExists($PID)
Sleep(100)
WEnd
SplashOff() -
Oder wie erkenne ich welches der aktuelle Benutzer ist?
Deswegen habe ich ja den zweiten Pfad "HKCU" hinzugefügt.
-
Das Problem entsteht m.M. nach, weil du 2 getrennte Abfragen für einen Zustand machst.
Ich habe mal etwas geändert (Änderungen markiert mit ";#############"). Probiers aus.Spoiler anzeigen
[autoit]#RequireAdmin
[/autoit] [autoit][/autoit] [autoit]
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=netskatstart.ico
#AutoIt3Wrapper_Outfile=netskatstart.exe
#AutoIt3Wrapper_Res_Comment=Codet by Gummibaer
#AutoIt3Wrapper_Res_Description=AutoRunner for Netskat
#AutoIt3Wrapper_Res_Fileversion=1.0.0.12
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=p
#AutoIt3Wrapper_Res_LegalCopyright=Gummibaer
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Run_Tidy=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt("TrayAutoPause", 0)
Opt("TrayIconDebug", 0)
Opt("TrayIconHide", 0)
#cs ----------------------------------------------------------------------------AutoIt Version: 3.3.0.0
[/autoit] [autoit][/autoit] [autoit]
Author: myNameScript Function:
[/autoit] [autoit][/autoit] [autoit]
Template AutoIt script.#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit];[includes]
[/autoit] [autoit][/autoit] [autoit]
#include <Inet.au3>
#include <GuiTab.au3>
#include <SendMessage.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <File.au3>
#include <Array.au3>_Checkinstallation()
[/autoit] [autoit][/autoit] [autoit]If UBound($CmdLine) <> 4 Then
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "Parameter", "nicht alle Parameter beim Start von Netskatstart.exe eingegeben" & @CRLF & "Autoit wird beendet.")
;ExitEndIf
[/autoit] [autoit][/autoit] [autoit]
Global $netskat_Title = "NetSkat -"
Global $tTitle = "Turnier-Liste"
Global $sTitle = "Einstellungen für"
Global $neuTitle = "Neuen Spielernamen eingeben"
Global $spielername_bearbeiten = "Eigenen Spielernamen bearbeiten"
Global $netskatexe = "netskat.exe"
Global $spieler_neu = $CmdLine[2]
Global $mail_forts = $CmdLine[3]
;Global $NetSkatDir = _getNetSkatDir()
$NetSkatDir = "c:\Programme\Cutesoft\Netskat\";########################################################## Code so ändern erspart spätere Abfrage auf Gültigkeit
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($NetSkatDir) Then
Do
$NetSkatDir = FileSelectFolder("mIRC Verzeichniss auswählen!" & @CRLF & "Den Ordner wo sich die Netskat.exe", "C:\Programme", 7)
Until FileExists($NetSkatDir)
;~ MsgBox(0, "pfad", $NetSkatDir & @CRLF & "existiert nicht")
;~ $NetSkatDir = FileSelectFolder("mIRC Verzeichniss auswählen!" & @CRLF & "Den Ordner wo sich die Netskat.exe", "C:\Programme", 7)
EndIf
;~ MsgBox(0, "Pfad netskat", $NetSkatDir, 1)If Not ProcessExists($netskatexe) Then ; Wenn NetSkat nicht gestartet ist starte sie
[/autoit] [autoit][/autoit] [autoit]
;~ If Not $NetSkatDir Then ; Prüfe ob string lerr wenn ja dann msgbox + programm beenden
;~ MsgBox(48, "Fehler", "NetSkat wurde nicht gefunden!")
;~ Exit
;~ Else
Run($NetSkatDir & "\" & $netskatexe, $NetSkatDir)
;~ EndIf
EndIf
WinActivate($netskat_Title) ; Sende Actevirungsbefehl
WinWaitActive($netskat_Title) ; Warte auf Actives FensterLocal $netskat_gesamt_titel = WinGetTitle("[active]")
[/autoit] [autoit][/autoit] [autoit]
$baseline = StringSplit($netskat_gesamt_titel, " ") ; teile sting anhand des lerrzeichen$Spieler = $baseline[5] ;
[/autoit] [autoit][/autoit] [autoit]
;MsgBox(0, "", $Spieler)
If $Spieler <> $CmdLine[2] Then
ControlSend($netskat_Title, "", "", "!es") ; Sende ALT+e+s
WinActivate($spielername_bearbeiten) ; Sende Actevirungsbefehl
WinWaitActive($spielername_bearbeiten) ; Warte auf Actives Fenster$gefunden = ControlCommand($spielername_bearbeiten, "", "[CLASS:ListBox; INSTANCE:1]", "FindString", $spieler_neu)
[/autoit] [autoit][/autoit] [autoit]
;MsgBox(0, "find ", $gefunden)
If $gefunden = 0 Then
ControlClick($spielername_bearbeiten, "", "[CLASS:Button; INSTANCE:1]")
WinActivate($neuTitle) ; Sende Actevirungsbefehl
WinWaitActive($neuTitle) ; Warte auf Actives Fenster
ControlSetText($neuTitle, "", "Edit1", $spieler_neu)
Sleep(2000)
ControlClick($neuTitle, "", "[CLASS:Button; INSTANCE:2]")
Sleep(2000)
WinActivate($spielername_bearbeiten) ; Sende Actevirungsbefehl
WinWaitActive($spielername_bearbeiten) ; Warte auf Actives Fenster
ControlClick($spielername_bearbeiten, "", "[CLASS:Button; INSTANCE:4]")WinActivate($netskat_Title) ; Sende Actevirungsbefehl
[/autoit] [autoit][/autoit] [autoit]
WinWaitActive($netskat_Title) ; Warte auf Actives Fenster
ControlSend($netskat_Title, "", "", "!ee") ; Sende ALT+e+e
WinWait($sTitle) ; Warte auf einstellungsfenster "Einstellungen für"
WinActivate($sTitle) ; Sende Actevirungsbefehl
WinWaitActive($sTitle) ; Warte auf Actives Fenster; Hole Handle und ids für tabzuweisung
[/autoit] [autoit][/autoit] [autoit]
$shWnd = WinGetHandle($sTitle)
$shTab = ControlGetHandle($shWnd, "", "SysTabControl321")
$TabID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $shTab)
$TabID = $TabID[0]; Wechsel zum Tab persönliche daten
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlTab_SetCurFocus($shTab, 2) ; Daten Spielerverzeichniss
$sResult = _SendMessage($shWnd, $WM_NOTIFY, $TabID, $TCN_SELCHANGE)
ControlClick($sTitle, "", "[CLASS:Button; INSTANCE:1]")
;MsgBox(0, "", "1")
;ControlClick($sTitle, "", "[CLASS:Button; INSTANCE:6]")
; Wechsel zum Tab Spiel-server
_GUICtrlTab_SetCurFocus($shTab,
; Daten Spielerverzeichniss
$sResult = _SendMessage($shWnd, $WM_NOTIFY, $TabID, $TCN_SELCHANGE)
ControlSetText($sTitle, "", "Edit1", "92.51.143.26");MsgBox(0, "", "2")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ControlClick($sTitle, "", "[CLASS:Button; INSTANCE:5]")
EndIfControlCommand($spielername_bearbeiten, "", "[CLASS:ListBox; INSTANCE:1]", "SelectString", $spieler_neu)
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "Spielername wechseln", "Neu eingestellt" & " " & $spieler_neu & @CRLF & "nach 2 sec schliesse ich selbst ", 2)
ControlClick($spielername_bearbeiten, "", "[CLASS:Button; INSTANCE:4]")EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]WinActivate($netskat_Title) ; Sende Actevirungsbefehl
[/autoit] [autoit][/autoit] [autoit]
WinWaitActive($netskat_Title) ; Warte auf Actives Fenster
ControlSend($netskat_Title, "", "", "!ee") ; Sende ALT+e+eWinWait($sTitle) ; Warte auf einstellungsfenster
[/autoit] [autoit][/autoit] [autoit]
WinActivate($sTitle) ; Sende Actevirungsbefehl
WinWaitActive($sTitle) ; Warte auf Actives Fenster
;MsgBox(0, "", "?????????")
; Hole Handle und ids für tabzuweisung
$shWnd = WinGetHandle($sTitle)
$shTab = ControlGetHandle($shWnd, "", "SysTabControl321")
$TabID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $shTab)
$TabID = $TabID[0]; Wechsel zum Tab Datenverzeichniss
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlTab_SetCurFocus($shTab, 4) ; Daten Spielerverzeichniss
$sResult = _SendMessage($shWnd, $WM_NOTIFY, $TabID, $TCN_SELCHANGE)
; Lese SpielerDatenVerzeichniss aus
$Pfad_SpielProtokol = ControlGetText($sTitle, "", "Edit1")
IniWrite(@ScriptDir & "\netskat.mrc", "super-tool", "Pfad_SpielProtokoll", $Pfad_SpielProtokol)
;MsgBox(0, "", "pfad geschrieben")
ControlClick("Einstellungen für ", "", "[CLASS:Button; INSTANCE:2]")_ScanneLogDir($Pfad_SpielProtokol, 1)
[/autoit] [autoit][/autoit] [autoit]If $CmdLine[1] == "E" Then
[/autoit] [autoit][/autoit] [autoit]
ControlSend($netskat_Title, "", "", "{F2}")
ControlSend($netskat_Title, "", "", "!e")
ControlSend($netskat_Title, "", "", "{ENTER}")
ControlSend($netskat_Title, "", "", "{TAB 3}")
ControlSend($netskat_Title, "", "", "{ENTER}")
ElseIf $CmdLine[1] == "M" Then
ControlSend($netskat_Title, "", "", "{F2}")
ControlSend($netskat_Title, "", "", "!M")
ControlSend($netskat_Title, "", "", "{ENTER}")
ControlSend($netskat_Title, "", "", "^v")
ElseIf $CmdLine[1] == "FE" Then
ControlSend($netskat_Title, "", "", "!sf")
ControlSend($netskat_Title, "", "", "!e")
ElseIf $CmdLine[1] == "FM" Then
ControlSend($netskat_Title, "", "", "!sf")
ControlSend($netskat_Title, "", "", "!n")
EndIfIf _Singleton("NetSkatUeberwachung", 1) = 0 Then Exit ; Nur eine Instance erlauben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
While ProcessExists($netskatexe)
; Hauptschleife Wartet auf Spielende
If WinExists($tTitle) Then
While WinActive($tTitle)
$thWnd = WinGetHandle($tTitle)
$thandle = ControlGetHandle($thWnd, "", "Button3")
$var = ControlGetText($thWnd, "", "Button3")
If $var = "Spielergebnis als Email verschicken" Then
_ScanneLogDir($Pfad_SpielProtokol)
EndIf
Sleep(30)
WEnd
EndIf
Sleep(30)
#cs
; Hauptschleife Wartet auf Fortsetzen
If WinExists("Daten zum Fortsetzen einer Runde exportieren") Then
If WinActive("Daten zum Fortsetzen einer Runde exportieren") And MsgBox(4, "Auswahl", "Automatisch ist JA" & @CRLF & "Selbst wählen = NEIM") = 6 Then
ControlSetText("Daten zum Fortsetzen einer Runde exportieren", "", "Edit1", $mail_forts)
Send("{ENTER}")
Sleep(10000)
;MsgBox(0, "", "Ich sende Daten ab", 2)
ControlClick("Daten zum Fortsetzen einer Runde exportieren", "", "[ID:64]")
Sleep(10000)
EndIf
EndIf
#ce
; Hauptschleife Wartet auf Fortsetzen
;Hauptschleife Wartet auf Fortsetzen
;########################################################################################################
While WinExists("Daten zum Fortsetzen einer Runde exportieren") And _
WinActive("Daten zum Fortsetzen einer Runde exportieren")
If MsgBox(4, "Auswahl", "Automatisch ist JA" & @CRLF & "Selbst wählen = NEIN") = 6 Then
ControlSetText("Daten zum Fortsetzen einer Runde exportieren", "", "Edit1", $mail_forts)
Send("{ENTER}")
Sleep(10000)
;MsgBox(0, "", "Ich sende Daten ab", 2)
ControlClick("Daten zum Fortsetzen einer Runde exportieren", "", "[ID:64]")
Sleep(10000)
EndIf
WEndWEnd
[/autoit] [autoit][/autoit] [autoit]
_ScanneLogDir($Pfad_SpielProtokol)Func _ScanneLogDir($logdir, $verschieben = 0)
[/autoit] [autoit][/autoit] [autoit]If $logdir = "" Then Return
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($logdir & "\Spielprotokolle\Archiv") Then DirCreate($logdir & "\Spielprotokolle\Archiv")
If Not FileExists($logdir & "\Spielprotokolle\Unbekannt") Then DirCreate($logdir & "\Spielprotokolle\Unbekannt")
Local $hSearch, $sFile, $tFile
$count = 0
Dim $FileListArray[1][2]
$hSearch = FileFindFirstFile($logdir & "\Spielprotokolle\*.TXT")
;MsgBox(0, "4---------$hSearch", $hSearch)If $hSearch <> -1 Then
[/autoit] [autoit][/autoit] [autoit]
While 1
$sFile = FileFindNextFile($hSearch)
;MsgBox(0, '155----------$sfile', $sFile)If @error Then
[/autoit] [autoit][/autoit] [autoit]
SetError(0)
ExitLoop
EndIf
If StringInStr(FileGetAttrib($sFile), "D") == 1 Then ContinueLoop
$tFile = $logdir & "\Spielprotokolle\" & $sFile
;MsgBox(0, '5----------$tfile', $tFile)
;MsgBox(0, "6--------------------verschieben", $verschieben)If $verschieben = 0 Then
[/autoit] [autoit][/autoit] [autoit]
ReDim $FileListArray[$count + 1][2]
$t = FileGetTime($tFile, 0)
$FileListArray[$count][0] = $tFile
$FileListArray[$count][1] = $t[0] & "." & $t[1] & "." & $t[2] & "." & $t[3] & "." & $t[4] & "." & $t[5]
$count += 1
Else
;MsgBox(0, "173-------------##", $verschieben & @CRLF & $tFile & @CRLF & $logdir & @CRLF & $sFile)FileMove($tFile, $logdir & "\Spielprotokolle\Unbekannt\" & $sFile, 1)
[/autoit] [autoit][/autoit] [autoit]
EndIf
WEnd
FileClose($hSearch)
EndIf
If $verschieben = 0 Then_ArraySort($FileListArray, 1, 0, 0, 1)
[/autoit] [autoit][/autoit] [autoit]If $FileListArray[0][0] <> "" Then _oeffne_LOG_und_lese_daten_aus($FileListArray[0][0], $logdir)
[/autoit] [autoit][/autoit] [autoit]
EndIf
;FileMove($logdir & "\Spielprotokolle\*.TXT", $logdir & "\Spielprotokolle\Unbekannt\",
EndFunc ;==>_ScanneLogDirFunc _oeffne_LOG_und_lese_daten_aus($file, $logdir)
[/autoit] [autoit][/autoit] [autoit]
Local $ende = False, $counter, $SpielCounter, $Spieler[3][5]
Dim $aRecords
_FileReadToArray($file, $aRecords)
;_ArrayDisplay($aRecords, "$aRecords")
For $i = 1 To $aRecords[0]
If StringLeft($aRecords[$i], 6) = "Spiel " And StringIsDigit(StringMid($aRecords[$i], 7)) Then
$rLine = StringSplit($aRecords[$i], " ", 2)
$SpielCounter = $rLine[1]
EndIf
If $ende = True Then
$counter += 1
$rLine = StringSplit($aRecords[$i], " ", 2)
If $counter = 1 Then
$playerS = $rLine[5]
ElseIf $counter = 3 Then
$playerE = $rLine[5]
ElseIf $counter = 5 Then
$Spieler[0][0] = $rLine[0]
$Spieler[0][1] = $rLine[2]
$Spieler[0][2] = $rLine[5]
ElseIf $counter = 6 Then
$Spieler[0][3] = $rLine[4]
ElseIf $counter = 7 Then
$Spieler[0][4] = $rLine[2]
ElseIf $counter = 9 Then
$Spieler[1][0] = $rLine[0]
$Spieler[1][1] = $rLine[2]
$Spieler[1][2] = $rLine[5]
ElseIf $counter = 10 Then
$Spieler[1][3] = $rLine[4]
ElseIf $counter = 11 Then
$Spieler[1][4] = $rLine[2]
ElseIf $counter = 13 Then
$Spieler[2][0] = $rLine[0]
$Spieler[2][1] = $rLine[2]
$Spieler[2][2] = $rLine[5]
ElseIf $counter = 14 Then
$Spieler[2][3] = $rLine[4]
ElseIf $counter = 15 Then
$Spieler[2][4] = $rLine[2]
EndIf
EndIf
If $ende = False And $SpielCounter = 36 And $aRecords[$i] = "******************************************************************" Then $ende = True
Next
$t = FileGetTime($file, 0);~ id datum sp s1 s2 s3 p1 p2 p3 g1 g2 g3 v1 v2 v3 E Spieler
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$url = "http://super-skat.de/skat/Gummibaer/eintragen.php"
$daten = "/?Datum=" & $t[2] & "." & $t[1] & "." & $t[0] & "." & $t[3] & "&Uhrzeit=" & $t[3] & ":" & $t[4] & ":" & $t[5] & "&sp=36&s1=" & $Spieler[0][0] & "&s2=" & $Spieler[1][0] & "&s3=" & $Spieler[2][0] & "&p1=" & $Spieler[0][4] & "&p2=" & $Spieler[1][4] & "&p3=" & $Spieler[2][4] & "&g1=" & $Spieler[0][1] & "&g2=" & $Spieler[1][1] & "&g3=" & $Spieler[2][1] & "&v1=" & $Spieler[0][2] & "&v2=" & $Spieler[1][2] & "&v3=" & $Spieler[2][2] & "&E=" & $playerE & "&Spieler=" & $playerS
$string = $url & $daten
;MsgBox(0, 'Datensatz', $string);------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
$result = _INetGetSource($string)
If $result = "OK" Then
$result = "Daten wurden eingetragen!"
ElseIf $result = "OK2" Then
$result = "Daten schon vorhanden!"
ElseIf $result = "Error" Or $result = "" Then
$result = "Daten nicht eingetragen!" & @CRLF & " server problem wahrscheinllich"
Else
$result = "Keine Verbindung zum Server"
EndIf
If MsgBox(4 + 32, "Soll Netskat beendet werde?", "AutoIt--Meldung: " & @CRLF & $result) = 6 Then
FileMove($file, $logdir & "\Spielprotokolle\Archiv\",
MsgBox(0 + 48, "verschieben", "Protokolldatei wurde in Ordner Archiv Verschoben")
Exit
Else
MsgBox(0 + 64, "Ergebniss melden:", "Nun kannst du aus Netskat heraus Mailen")
Exit
EndIf
EndFunc ;==>_oeffne_LOG_und_lese_daten_ausFunc _getNetSkatDir()
[/autoit] [autoit][/autoit] [autoit]
$temp = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetSkat", "UninstallString") ; Hole String aus der Reg db
If Not $temp Then Return
$baseline = StringSplit($temp, " ") ; teile sting anhand des lerrzeichen
$tNetSkatDir = StringMid($baseline[2], 3, StringLen($baseline[2]) - 13) ; schneide vore -f und hinten DeIsL1.isu ab
If $tNetSkatDir = "" Then
While 1
$pfad = FileSelectFolder("NetSkat Verzeichniss auswählen!" & @CRLF & "Den Ordner wo sich die netskat.exe befindet", "", 7)
If @error = 1 Then
MsgBox(48, "Instalation Fehler", "Instalation Abgebrochen")
Exit
EndIf
If FileExists($pfad & "\netskat.exe") Then
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetSkat", "UninstallString", "REG_SZ", @WindowsDir & "\unin0407.exe -f" & $pfad & "\DeIsL1.isu")
Return $pfad
ExitLoop
EndIf
MsgBox(48, "Instalation Fehler", "Im Ordner" & @CRLF & $pfad & @CRLF & "Befindet sich keine netskat.exe")
WEnd
MsgBox(48, "282 suche Netskatordner", "mit oeffnen dialog")EndIf
[/autoit] [autoit][/autoit] [autoit]Return $tNetSkatDir
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_getNetSkatDirFunc _Checkinstallation()
[/autoit] [autoit][/autoit] [autoit]
If FileExists("mirc.exe") And FileExists("mirc.ini") Then
If Not FileExists("netskat.mrc") Then FileInstall("netskat.mrc", "netskat.mrc")
Return
Else
While 1
$pfad = FileSelectFolder("mIRC Verzeichniss auswählen!" & @CRLF & "Den Ordner wo sich die mIRC.exe" & @CRLF & "und die mIRC.ini befindet", "", 7)
If @error = 1 Then
MsgBox(48, "Instalation Fehler", "Instalation Abgebrochen")
Exit
EndIf
If FileExists($pfad & "\mirc.exe") And FileExists($pfad & "\mirc.ini") Then ExitLoop
MsgBox(48, "Instalation Fehler", "Im Ordner" & @CRLF & $pfad & @CRLF & "Befindet sich keine mIRC.exe")
WEnd
FileCopy(@ScriptFullPath, $pfad & "\netskatstart.exe", 1)
FileInstall("netskat.mrc", $pfad & "\netskat.mrc")
FileInstall("netskat.jpg", $pfad & "\netskat.jpg")
FileInstall("netskat_import.exe", $pfad & "\netskat_import.exe")
FileInstall("grandovert.exe", $pfad & "\grandovert.exe")
$filenams = $pfad & "\mirc.ini"
$section = "script"
$key = "n0"
$value = "on 1:START:{ /.load -rs netskat.mrc }"
IniWrite($filenams, $section, $key, $value)
MsgBox(0 + 64, "Load", "Netskatstart.exe , Sceenshot und Popups installiert")
;_SelfDelete()
Exit
EndIfEndFunc ;==>_Checkinstallation
[/autoit]
Ich habe es jedenfalls so verstanden, dass bei "Nein" die Abfrage-Schleife wieder durchlaufen werden soll. -
Findest du in der Registry.
Bei XP: HKEY_USERS\S-1-5-21-1935655697-688789844-725345543-1004\Control Panel\International
bzw. allgemein unter:
HKEY_CURRENT_USER\Control Panel\International -
Noch ein Tipp:
[autoit]
Bitte vermeiden Globale Variablen innerhalb einer Funktion zu deklarieren. Falls es sich nicht umgehen lassen sollte, dann in der Form:If Not IsDeclared("Variable") Then Global $Variable
[/autoit]