ZitatDu bist ein Super Märchenonkel Andy
Wenns anders nicht geht, dann eben so ![]()
ZitatDu bist ein Super Märchenonkel Andy
Wenns anders nicht geht, dann eben so ![]()
Was macht denn der Untertan im Königreich wenn er bei dem KING eine Audienz haben möchte?
Zuerst notiert er sich die Adresse des KINGS (!!!!!!!!!!!!!!!!!!!!!!!!!) und die Portnummer.....
Um überhaupt mit dem KING zu kommunizieren, benötigt man ..........TCPStartup()
Der Untertan braucht einen Anschluß(Socket) zum KING
Nun möchte sich der Untertan mit dem König VERBINDEN ( na, wie heisst das auf englisch?).... Er bekommt diesen Anschluß von ...........TCPConnect()
Der King hat die Verbindung akzeptiert, der Herold gibt das bekannt!....(Messagebox vom King!)
Der Untertan möchte dem KING einiges erzählen, er ist aber so erfürchtig, dass er vor jeder Nachricht in Ohnmacht fällt (ca 2,5-3 Sekunden
so lange, bis der Herold die Nachricht an alle verteilt hat (Dauer der Msgbog beim Server))
Nun schreibt der Untertan einen TEXT, den er dem KING schicken möchte (na wo kommt der Text her....aus einer INPUTBOX!)
...und SENDET (TCPsend() ) diesen Text an die Verbindung (Socket)....also TCPSend($socket,$text)
Der King empfängt die Nachricht und schickt den Herold ins Land.....der Untertan ist vor Erfurcht Ohnmächtig geworden und sendet, als er wieder erwacht, die nächste Nachricht......
Das macht der Untertan! SONST NICHTS! Wenn du die wichtigsten Stichpunkte aufgeschrieben hast, dann kannst du das Script des Untertanen(CLIENT) schreiben......VERSUCHS!
CLIENT:
$Empfaenger_IP = @IPAddress1 ;IP-Adresse des Servers!
$Port = 33891 ;PORT, auf dem der Server lauscht!
TCPStartup()
[/autoit] [autoit][/autoit] [autoit]$Socket = TCPConnect($Empfaenger_IP, $Port)
While 1
Sleep(2500)
$text = InputBox("Client", "Bitte Nachricht an den Server eingeben:")
If $text = "" Or @error Then ExitLoop
TCPSend($Socket, $text)
WEnd
TCPShutdown()
[/autoit]/*EDIT*/ Du kannst testweise den Client und den Server auf einem Rechner laufen lassen! Also erst das SERVER-Script kompilieren und starten (ggf meckert hier schon die Firewall, also erlauben!), danach das CLIENT-Script starten (z.B. direkt aus Scite). Wenn die Firewall wieder meckert, auch diese Verbindung erlauben!
Wenn du eine etwas bessere Lösung (ggf incl. Protokoll) suchst, dann schau mal HIER. Anhand der Kommentare in den Scripten sollte klar werden, warum der Client erst nach Freigabe durch den Server sendet uvm....
Hi,
gaaaaaannnnnzzz ruuuuhhhhiiiiggggg^^
Zunächst einmal solltest du dir überlegen, was du machen möchtest. Hört sich jetzt vielleicht bescheuert an, aber genau daran hapert es m.E. bei dir!
Nimm 2 Blätter Papier (ja, dazu braucht man keinen Computer^^) und schreib auf das eine SERVER und auf das andere CLIENT.
Jetzt hast du dein Problem schon in 2 Einzelteile zerlegt, also ist jedes nur noch halb so schlimm^^
Der SERVER ist ein Programm, welches auf eine Verbindung wartet, schreib das auf das Blatt Papier.
Ok, was braucht man für eine (einfache) TCP-Verbindung? IP-Adresse, und Portnummer....AUFSCHREIBEN (untereinander)!
Wo bekommt der Server seine IP-Adresse her? Na die hat er schon, das ist die IP-Adresse der Netzwerkkarte mit der er verbunden ist. In AutoIt z.B. mit @IPAddress1 zu bekommen. Aufschreiben !(hinter IP-Adresse)
Wo bekommt der Server seinen Port her? Der Server ist der Meister aller Klassen, gewissermassen der King und als KING fragt man nicht, man LEGT FEST! Einige Ports sind schon belegt, aber andere (>50000) sind nicht belegt, da wählt man einfach einen aus z.b. 55438
(Aufschreiben hinter "Port"....aber das kennst du ja nun....)
Weiter gehts. Damit überhaupt irgendetwas mit TCP gemacht werden kann, muss man das vorbereiten mittels TCPStartup() (aufschreiben....das spare ich mir ab jetzt, wenn zum Schluss dein Script nicht läuft, dann liegts daran!)
Der SERVER "hört" (na, wie heisst "hören" auf englisch?) auf auf einem Anschluss (Socket), und diesen Anschluss erstellt man mit $Socket=TCPlisten().
So, jetzt kommts! Der Server ist wie gesagt der KING und es bekommt nur der eine Audienz beim KINg, der auch AKZEPTIERT wird (wie heisst akzeptieren auf englisch??). Na also, der King "hört" nun SO LANGE, bis er einen ihm genehmen Teilnehmer AKZEPTIERT! Weil der King etwas vergesslich ist, schreibt er sich die KENNUNG dieser akzeptierten Verbindung auf....
$connectedsocket=TCPaccept()....(solange warten, bis kein Fehler (-1) mehr auftritt)
Damit jeder im Königreich auch weiss, dass der KING eine Verbindung aufgebaut hat, jagt der King seinen Herold durchs Land und der bringt diese NACHRICHT in jeden BRIEFKASTEN des Landes....(Kombiniere mal die englischen Wörter von Nachricht und Briefkasten (Kurzwort)....
)
Der King ist sehr geduldig mit seinen Untertanen, er sitzt auf seinem Thron und wartet ...und wartet....und wartet...ENDLOS...darauf einen Untertanen mit einer bestimmten Kennung zu EMPFANGEN (wie heisst das Wort auf englisch?) (aufschreiben!) ....TCPRecv()
Irgendwann fasst sich der verbundene Untertan ein Herz und spricht den KING schüchtern über die Verbindung an! HA! Jetzt wird der King munter, er EMPFÄNGT (wie heisst das Wort auf englisch?) die Nachricht des Untertanen. JUHUUUUU! Endlich erfährt der KING die neuesten Neuigkeiten aus seinem Königreich und schreibt sie auf!!! $empfang=TCPRecv()
Damit auch jeder im Königreich erfährt, was es neues gibt, schickt der KINg den Herold.....und ....(das war die Sache mit der Messagebox....)
Der Untertan freut sich über die gute Laune des Kings und möchte nun neue Nachrichten erzählen, ihm fallen aber keine ein, also rennt er schnell weg und sucht neuen Klatsch und Tratsch aus dem Königreich....
Währendessen bleibt dem KING nichts weiter übrig, als auf die Nachrichten des Untertanen zu warten....und zu warten.... und zu warten, also setzt er sich auf seinen Thron ......(das hatten wir doch schon mal?!)
Soweit die Geschichte vom KING.....öhm...bei den EDV´lern ist das der "SERVER" also solltest du die Geschichte 1:1 in die EDV-Sprache umsetzen können! Versuchs mal!!!!
SERVER:
;Serverprozess auf dem Empfangsrechner starten
[/autoit] [autoit][/autoit] [autoit]$IP_adresse=@IPAddress1
$Port=33891
TCPStartup()
[/autoit] [autoit][/autoit] [autoit]$Socket = TCPListen($IP_adresse, $port, 100)
[/autoit] [autoit][/autoit] [autoit]do ;solange warten, bis ein Client eine Verbindung aufbaut
$ConnectedSocket = TCPAccept($Socket)
ToolTip("Server empfangsbereit...")
until $ConnectedSocket <> -1 ;wenn Verbindung akzeptiert, dann weitermachen
MsgBox(0, "TCP-Server", "Server hat Verbindung zum Client aufgebaut", 1)
[/autoit] [autoit][/autoit] [autoit]While 1 ;der KING hat endlos Zeit.......
Do ;warten auf die Nachricht vom Client
$recv = TCPRecv($ConnectedSocket, 2048) ;nachricht empfangen
Sleep(10) ;Prozessor entlasten^^
Until $recv <> "" ;...solange warten, bis eine Nachricht eingetroffen ist
MsgBox(0, "Server hat empfangen:", $recv, 2)
WEnd
TCPShutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit].....oha...du hast ja noch ein zweites Blatt Papier........
Wenn man das Hilfefenster per parent-Parameter (s.
[autoit]GuiCreate()
[/autoit]) als "Child" einbindet, muss man sich über Öffnen/Schliessen keine Gedanken mehr machen. Und spätestens bei der Verwendung von mehreren Child-Fenstern wird auch der OnEvent-Modus interessant, bzw zeigt die Vorteile gegenüber dem Msgmode....
Wenn es um rechenintensive Anwendungen geht, dann kann man das "Pseudo-MultiThreating" statt kompliziert im Code direkt von dem machen lassen, der dafür schon alles eingerichtet hat, nämlich Windows!
Gerade bei Multikernsystemen macht das Sinn, da man Windows veranlassen kann bestimmte Programme an bestimmte Prozessorkerne zu binden. Beispiel AES-Verschlüsselung bzw. Erzeugung der Schlüssel.
Wenn man 4 Dateien mit 4 unterschiedlichen Schlüsseln verschlüsseln möchte, dann kann man das im Code natürlich irgendwie "parallel" machen, allerdings wird das Programm sowieso nur seriell auf einem Prozessorkern abgearbeitet, und man benötigt 4 (für jede Datei eine) Zeiteinheiten.
Teilt man das Problem in 4 Programme auf (jedes Programm an einen Prozessorkern gebunden), dann benötigt man nur EINE Zeiteinheit, da auf jedem Prozessorkern die Verschlüsselung nur eine Zeiteinheit dauert. Läppische Geschwindigkeitssteigerung durch paralleles Abarbeiten um den Faktor 4!
Aber wie peethebee schon geschrieben hat, funktioniert das nur, wenn die einzelnen "Threads" nicht voneinander abhängig sind.
Und wenn es um richtig "lange" Berechnungen geht, dann wäre auch eine Verteilung an andere Rechner im Netzwerk möglich....CloudComputing ist da wohl das neue Modewort (vgl BOINC), seti@home hat das schon vor Jahren gemacht^^
Oscar ,
wenn Dein Name im Zusammenhang mit Lexika/Wörterbüchern fällt, assoziiere ich das SOFORT mit dem Dictionary-Objekt
...also lass die Jungs nicht hängen und zeig mal wie man so etwas "schnell" löst ![]()
Hi,
man muss unterscheiden zwischen "nicht gleich" (ungleich ist "<>") und dem logischen "Nicht" (NOT).
Autoit interpretiert alles, was nicht 0 ist als logisches
False ;Falsch
[/autoit]. Alles was Null ist, als
[autoit]True ;Wahr
[/autoit][autoit]for $a=-3 to 3
msgbox(0,$a,"NOT ("&$a&") = "¬($a))
next
Bei dem IF-Vergleich wird auf True geprüft, daher muss man aufpassen, was eine dort abgefragte Funktion zurückgibt!
Hi,
habe etwas ähnliches bei mir am laufen. Die Clients finden "von selbst" heraus, auf welchem der Rechner im Netzwerk die passenden Serverprozesse laufen d.h. man muss keine IP-Adresse des Servers kennen. Auch ist es möglich, mit einem Client Kontakt zu mehreren Servern gleichzeitig zu haben. So ist es eigentlich egal, welcher der "Server" gerade online ist. Fährt einer der Server (oder Clients) runter, dann merkt das die Gegenseite nach einstellbarer Zeit (zzt 500 MilliSekunden). Ein "Miniprotokoll^^" ist auch dabei, der Client/Server sendet erst dann Daten, wen die entsprechende Gegenstelle auch bereit ist.
Es ist natürlich egal, welcher der Prozesse zuerst gestartet wird.
PrideRage
Die beiden Programme laufen sogar zum Testen auf einem Rechner. Datenaustausch zwischen zwei AutoItscripten wäre nur eine der Möglichkeiten.
Client:
;Kompilieren und auf dem Clientrechner ausführen,
;vorher den Serverprozess auf dem Empfängerrechner starten
;der Client sucht sich den Server selbstständig aus der Liste der verbundenen Rechner im lokalen Netzwerk
;Protokoll: der Client schickt an den Server eine Statusanfrage, erst wenn der Server bereit ist, schickt der Client seine Nachricht
; Wenn der Server nicht innerhalb von 500 ms antwortet, wird der nächste Rechner in der Liste angefragt
;
;Andy @ AutoIt.de
TCPStartup()
[/autoit] [autoit][/autoit] [autoit]Local $rechner = _NetServerEnum() ;alle Rechner im Netz auflisten vgl. http://www.autoit.de/index.php?page…82476#post82476
Local $Port = 33891 ;Portnummer
Dim $serverconnect[UBound($rechner)] ;kontrolle, ob Verbindung zum Server besteht
Dim $connectionenabled[UBound($rechner)] ;Flag, welches von adlibenable/adlibregister benutzt wird um die poll-schleife zu verlassen
Dim $Empfaenger_IP[UBound($rechner)] ;..wie der name schon sagt, die IP´s der Server
Dim $ConnectedSocket[UBound($rechner)] ;s.o.
For $i = 1 To UBound($rechner) - 1 ;Initialisieren...
$serverconnect[$i] = 0
$Empfaenger_IP[$i] = 0
$ConnectedSocket[$i] = 0
$connectionenabled[$i] = 0
Next
While 1
;alle rechner im netz suchen, auf denen ein serverprozess auf port 33891 läuft und dort die Nachricht hinschicken
For $i = 1 To UBound($rechner) - 1 ;alle Rechner im Netz
;If @ComputerName <> $rechner[$i] Then ;nicht an den eigenen rechner schicken
If $serverconnect[$i] = 0 Then ;wenn noch nicht zu diesem server verbunden ist,
$Empfaenger_IP[$i] = TCPNameToIP($rechner[$i]) ;IP-Adresse des Servers rausfinden
$ConnectedSocket[$i] = TCPConnect($Empfaenger_IP[$i], $Port) ;TCP-Connect zum Server
EndIf
If @error <> 1 And $ConnectedSocket[$i] <> -1 Then ;wenn mit dem Server verbunden
AdlibRegister("_connect", 5000) ;wenn nach 500ms der Server nicht geantwortet hat, Funktion aufrufen, so dass do/until beendet wird (server offline)
Do ;warten, bis der Server eine Info geschickt hat, daß er bereit ist...
$recv = TCPRecv($ConnectedSocket[$i], 2048) ;Nachricht vom Server empfangen
Sleep(10) ;Prozessor entlasten
Until $recv <> "" Or $connectionenabled[$i] = 1 ;server hat connect bestätigt oder adlib hat nachricht geschickt, dass server offline
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $connectionenabled[$i] = ' & $connectionenabled[$i] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
If $recv <> "" Then ;wenn server eine nachricht geschickt hat, dass er bereit ist, dann Daten an Server schicken
AdlibUnRegister("_connect"); adlib abschalten
$text = InputBox("TCP-Client", "Bitte geben sie den Text ein, der zum Serverprozess auf " & $rechner[$i] & " (" & TCPNameToIP($rechner[$i]) & ") gesendet werden soll")
If $text <> "" Then TCPSend($ConnectedSocket[$i], $text) ;nachricht zum Server schicken
Sleep(2000);warten bis die msgbox beim server verschwunden ist
$serverconnect[$i] = 1 ;Daten kamen vom Server, also besteht eine Verbindung
Else ;keine Daten vom Server bekommen, verbindung zum server abgebrochen
AdlibUnRegister("_connect"); adlib abschalten
MsgBox(0, 0, "Server offline, nächsten Server suchen")
$connectionenabled[$i] = 0 ;flag für do/until setzen
$serverconnect[$i] = 0 ;verbindung zum server abgebrochen
Sleep(2000) ;zwei Sekunden warten, dann nochmal Connectversuch zum Server (Server stellt in 0,5 sec fest, ob ein Connect mit dem client besteht)
EndIf
EndIf
Next
WEnd
TCPShutdown()
Func _NetServerEnum($iSrvType = -1, $sDomain = '') ;http://www.autoit.de/index.php?page…82476#post82476
Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1] = [0], $i
Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
Local $uString = DllStructCreate("char[16]")
Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
If Not ($sDomain = '' Or $sDomain = '*') Then
DllStructSetData($uDomain, 1, StringToBinary($sDomain, 2))
$pDomain = DllStructGetPtr($uDomain)
EndIf
Local $ret = DllCall("netapi32.dll", "int", "NetServerEnum", _
"ptr", 0, "int", 100, _
"ptr", DllStructGetPtr($uBufPtr, 1), "int", -1, _
"ptr", DllStructGetPtr($uBufPtr, 2), _
"ptr", DllStructGetPtr($uBufPtr, 3), _
"int", $iSrvType, "ptr", $pDomain, "int", 0)
If $ret[0] Then Return SetError(1, $ret[0], '')
Local $res[DllStructGetData($uBufPtr, 3) + 1] = [DllStructGetData($uBufPtr, 3)]
For $i = 1 To DllStructGetData($uBufPtr, 3)
Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr, 1) + ($i - 1) * $iRecLen)
Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord, 2))
DllStructSetData($uString, 1, BinaryToString(DllStructGetData($sNBName, 1), 2))
$res[$i] = DllStructGetData($uString, 1)
Next
$ret = DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr, 1))
Return $res
EndFunc ;==>_NetServerEnum
Func _connect() ;adlib
If $connectionenabled[$i] = 0 Then $connectionenabled[$i] = 1
EndFunc ;==>_connect
Server:
;Serverprozess auf dem Empfangsrechner starten
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $ConnectedSocket
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]TCPStartup()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$MainSocket = TCPListen(@IPAddress1, 33891, 100)
[/autoit] [autoit][/autoit] [autoit]While 1
While 1 ;solange warten, bis ein Client eine Verbindung aufbaut
$ConnectedSocket = TCPAccept($MainSocket)
ToolTip("Server empfangsbereit...")
If $ConnectedSocket <> -1 Then ExitLoop ;wenn daten empfangen...
Sleep(10)
WEnd
ConsoleWrite("client online!")
ToolTip("")
MsgBox(0, "TCP-Server", "Server hat Verbindung zum Client aufgebaut", 1)
$connectionenabled = 1
While 1 ;solange Verbindung zum Client besteht...
$anz = TCPSend($ConnectedSocket, "1") ;info an den client senden, dass der server bereit ist
If $anz <> 0 Or $connectionenabled = 1 Then ;nur, wenn Daten erfolgreich an den Client gesendet wurden
AdlibRegister("_connect", 5000) ;nach 5 Sekunden nachschauen, ob der client noch online ist
Do ;warten auf die Nachricht vom Client
$recv = TCPRecv($ConnectedSocket, 2048)
Sleep(10)
Until $recv <> "" Or $connectionenabled = 0 ;erst weitermachen , wenn eine Nachricht vom Client oder der Adlibfunktion kommt
AdlibUnRegister("_connect") ;adlib ausschalten
Else ;wenn keine daten an den Client gesendet wurden, dann ist der Client offline
ConsoleWrite("client offline!")
ExitLoop ;wieder auf einen Client warten
EndIf
If $recv <> "" Then ;wenn daten vom Client eingetroffen sind....
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $recv = ' & $recv & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
MsgBox(0, "server hat empfangen:", $recv, 1) ;Daten ausgeben und weiterverarbeiten, hier kann auch eine längere Datenverarbeitung stehen...Client sendet erst, wenn der Server wieder bereit ist
endif
WEnd
WEnd
TCPShutdown()
Func _connect() ; alle 5 sekunden nachschauen ob der client noch verbunden ist
$anz = TCPSend($ConnectedSocket, "1") ;info an den client senden, dass der server bereit ist
If $anz = 0 Or @error Then $connectionenabled = 0 ;wenn keine daten an den Client gesendet werden konnten ist der client offline
EndFunc ;==>_connect
Uuups, eins noch! Beta-Compile oder Beta-F5 verwenden oder Adlibregister()/-unregister() in adlibenable() ändern!
Hi, hilft das weiter?
#include <Array.au3>
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]Local $msg, $Input1, $Input2, $Beenden
local $lan_IP="nicht feststellbar"
local $wlan_IP="nicht feststellbar"
dim $a[1][1]
[/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
GUICreate("Form1", 263, 187, 390, 114)
$a = _GetAllNetAdapterInfo() ;alle Adapterinfos aus der Registry auslesen und in ein Array schreiben
if not isarray($a) Then ; wenn es keine Netzwerkadapter gibt, programm beenden
msgbox(1,"Fehler", "Es können keine Netzwerkadapter festgestellt werden!"&@crlf&"Programm wird beendet!")
Exit
endif
_ArrayDisplay($a) ;auskommentieren wenn nicht benötigt!
[/autoit] [autoit][/autoit] [autoit]For $i =1 to $a[0][0] ;alle adapter durchsuchen
if $a[$i][1]="LAN-Verbindung" then $lan_IP=$a[$i][5] ;wenn in der 2. Spalte der String "LAN-Verbindung" vorkommt, dann die 5. Spalte merken
if $a[$i][1]="Drahtlose Netzwerkverbindung" then $wlan_IP=$a[$i][5] ;wenn in der 2. Spalte der String "Drahtlose Netzwerkverbindung" vorkommt, dann die 5. Spalte merken
next
$Input1 = GUICtrlCreateInput($lan_IP, 112, 28, 105, 21) ;hier die gedfundene IP eintragen
$Input2 = GUICtrlCreateInput($wlan_IP, 112, 69, 105, 21) ;hier die gedfundene IP eintragen
GUICtrlCreateLabel("LAN IP Adresse", 16, 32, 79, 17)
GUICtrlCreateLabel("WLAN IP Adresse", 16, 72, 90, 17)
$Beenden = GUICtrlCreateButton("Beenden", 40, 120, 177, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE Or $msg = $Beenden
ExitLoop
EndSelect
WEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];######################################################################################################
;# Function Name: _GetAllNetAdapterInfo()
;# Description:: Auslesen aller vorhandenen Netzwerkadapter und deren Konfiguration
;# Parameter(s): keine
;# Requirement(s): keine
;# Return Value(s): Erfolg Array[0][0] Anzahl der Adapter
;# Array[n][0] Adapter Name (wie in Systemsteuerung ==> Netzwerkverbindungen)
;# Array[n][1] Adapter Beschreibung
;# Array[n][2] IP-Adresse
;# Array[n][3] SubNetMask
;# Array[n][4] DHCP-Enabled (0/1)
;# Array[n][5] DHCP IP-Adresse
;# Array[n][6] DHCP SubNetMask
;# Array[n][7] DHCP Default Gateway
;# Array[n][8] DHCP Server
;# Fehler Array[0][0] Leerstring (kein Adapter vorhanden)
;# Author(s): Bitboy, nach einer Idee von BugFix ([email='bugfix@autoit.de'][/email])
;######################################################################################################
Func _GetAllNetAdapterInfo()
Local $infoarr[1][9], $keyarr[1], $i = 0, $x = 0, $counter = 0, $tmp, $tmp2, $short
;Registrierte Adapter zählen
While 1
$i = $i + 1
$tmp = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services", $i)
If @error <> 0 Then ExitLoop
;Adapter sind in den einzigen Schlüsseln die mit "{" beginnen
If StringInStr($tmp, "{") Then
$short = 1 ;Merker zum Verkürzen der Schleife da Keys alphabetisch sortiert
$counter = $counter + 1
ReDim $keyarr[$counter + 1]
$keyarr[$counter] = $tmp ;Speichern der Adapterschlüssel
$keyarr[0] = $counter
Else
If $short = 1 Then ExitLoop
EndIf
WEnd
;Funktion verlassen wenn kein Adapter gefunden wurde
If $counter = 0 Then
$infoarr[0][0] = 0
Return $infoarr
EndIf
;Rückgabearray an Adapterzahl anpassen
ReDim $infoarr[$counter + 1][9]
$infoarr[0][0] = $counter
; TCP-Informationen auslesen
For $i = 1 To $counter
$infoarr[$i][2] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'IPAddress')
$infoarr[$i][3] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'SubnetMask')
$infoarr[$i][4] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'EnableDHCP')
$infoarr[$i][5] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpIPAddress')
$infoarr[$i][6] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpSubnetMask')
$infoarr[$i][7] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpDefaultGateway')
$infoarr[$i][8] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpServer')
Next
;Adapternamen auslesen
$i = 1
$short = 0
While 1
$tmp = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}", $i)
If @error <> 0 Then ExitLoop
$tmp2 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\" & $tmp, "NetCfgInstanceId")
For $x = 1 To $counter
;Zugeordnete Verbindung auslesen
$infoarr[$x][1] = RegRead('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\' & $keyarr[$x] & '\Connection', 'Name')
If $tmp2 = $keyarr[$x] Then
$infoarr[$x][0] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\" & $tmp, "DriverDesc")
$short = $short + 1 ;gefundene Namen zählen
EndIf
Next
If $short = $counter Then ExitLoop ;Alle Adapternamen gefunden
[/autoit] [autoit][/autoit] [autoit]$i = $i + 1
WEnd
Return $infoarr
EndFunc ;==>_GetAllNetAdapterInfo
Func GetIP($AdapterName)
Local $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2'), $Output = 0
Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter', 'WQL', 0x30)
If IsObj($colItems) Then
For $objItem In $colItems
Local $colItems2 = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration', 'WQL', 0x30)
If IsObj($colItems2) Then
For $objItem2 In $colItems2
If $objItem.Caption = $objItem2.Caption Then
If $objItem.NetConnectionID = $AdapterName Then
$Output = $objItem2.IPAddress(0)
EndIf
EndIf
Next
EndIf
Next
EndIf
Return $Output
EndFunc ;==>GetIP
$cmdline[0] ;Anzahl der übergebenen Dateien
$cmdline[1]....$cmdline[n] ;Dateien
$cmdlineraw ; string aller übergebener Dateien
Zitatd.h. wenn du 20 dateien markiert und im kontextmenü dein script auswählst, dann öffnet sich das script 20 mal und jedes frägt nur eine datei ab.
mit dragndrop oder einem "Senden an" ist das nicht so, daher habe ich das in einem der oberen Posts beschrieben....
was soll da nicht funktionieren?
[autoit]#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
[/autoit][autoit][/autoit][autoit]Local $listview, $button, $item1, $item2, $item3, $input1, $msg
[/autoit][autoit][/autoit][autoit]local $string1="text1"
local $string2="text2"
GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
$item1 = GUICtrlCreateListViewItem($string1&"|"&$string2&"|col23", $listview)
GUISetState()
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
funzt bei mir einwandfrei, musst allerdings das LuaStartupScript anpassen wie hier im 1. Post beschrieben, XP , Scite 1.79
Hi,
zeig einfach mal dein Script....
ciao
Andy
@rochus....
ZitatAußerdem baut das Script einen großen String.
Und aus was baut es den? Nur ETWAS eigene Initiative vorrausgesetzt wären mit einer Zeile Code die Pfade in ein Array extrahiert (sie befinden sich genauergesagt schon in einem...).
$cmdline IST bereits ein Array, was willst du da noch mehr?
Allerdings blicke ich in deinem Codeschnipsel sowieso nicht durch, ich dachte eigentlich, dass die Pfade der übergebenen Dateien gesucht werden?
Hallo,
du könntest dein Programm (oder eine Verknüpfung davon) in den SendTo-Ordner legen. Im Explorer-Kkontextmenü ist dann unter "Senden an" dein Programm zu sehen. Die so übergebenen Dateien liest man in AutoIt mittels
$cmdline[]
[/autoit]ein.
ciao
Andy
/*EDIT*/ kleines Beispiel, erstellt selbstständig eine Verknüpfung ins "Senden an"-Menü und zeigt die im Explorer ausgewählten oder per drag&drop auf das Programm gezogenen Dateien an:
;script kompilieren und starten,
;es erstellt eine Verknüpfung von sich selbst im SendTo-Ordner
;
;Funktionstest: Dateien im Explorer auswählen und im Kontextmenu an das Script senden
If $cmdline[0] = 0 Then ;es ist kein parameter(datei) übergeben worden
MsgBox(0, "EasyUpload", "Bitte im Windows-Explorer eine oder bis zu 60 Dateien auswählen und rechtsklicken." & @CRLF & "Im darauf folgendenden Kontextmenü bitte ""Senden an"" anwählen, dann in der folgenden Liste auf Easyupload klicken!" & @CRLF & @CRLF & "Es ist auch möglich, eine oder mehrere Dateien auf das Programmicon zu ziehen (drag&drop)."&@crlf&"Die Verknüpfung ins ""Senden an"" wird nun angelegt...")
$ret = FileCreateShortcut(@ScriptFullPath, @UserProfileDir & "\sendto\"&@ScriptName) ; sendto-eintrag zeigt jetzt auf easyupload_temp.exe
If $ret = 0 Then MsgBox(0, "Fehler", "Fehler beim Schreiben der Verknüpfung in den " & @UserProfileDir & "\sendto\ -Ordner")
Exit
EndIf
$files=""
for $i=1 to $cmdline[0]
$Files&=$cmdline[$i]&@CRLF
Next
msgbox(0,"Übergebene Dateien:",$files)
ZitatDas wollte ich eigentlich vermeiden, weil ist ja ni ganz Sinn der Sache
Doch, genau das ist der Sinn der Sache! Wenn ein Fehler auftritt, dann ist der Sinn der Sachen herauszufinden was den Fehler verursacht.
ZitatDas Problem ist auch erst seit dem ich die aktuelle Autoit Version nutze.
Vorher hatte ich noch die Version 3.2.0.1
Wenn du konsequent wärest (im Sinne des Sinns der Sache), dann hättest du den Thread nicht erstellt sondern einfach die (in deinem Script fehlerfrei lauffähige) Version 3.2.0.1. verwendet. Capice?
ZitatIch werds aber mal probieren.
Brav.... ![]()
Hallo,
diese Unart, Startposts zu löschen, sollte man mit 4-Wochenban bestrafen! Wenn die Frage so unwichtig ist, dass man sie nach 10 Minuten selbst LÖSCHT, dann gehört m.E. eigentlich der gesamte Thread ins Nulldevice! Mitsamt dem User....
Andy