Für mich ist der grafische Schnick-Schnack, den du, Eukalyptus, Andy und ein paar andere machen cool. ![]()
Beiträge von funkey
-
-
Danke!
Cool ist für mich zwar was anderes, aber manchmal könnte es ganz nützlich sein. -
Hallo,
ich habe mich nun endlich entschlossen die LibHaru-DLL (http://libharu.org/) in AutoIt zu wrappen. Damit können sehr schnell mittels Code PDF-Dateien erstellt werden. Anbei die UDF, ein Beispiel und die DLL. Bisher habe ich ca. 40% der 200 Funktionen gewrappt. Jeder ist eingeladen daran weiterzuarbeiten, damit die Bibliothek vollständig in AutoIt genutzt werden kann. Ich habe die DLL bereits genutzt, um einen CSV2PDF-Generator zu machen. Es gibt zwar bereits eine PDF-UDF komplett in AutoIt (http://www.autoitscript.com/forum/topic/11…ur-application/), aber die konnte ich aufgrund der langsamen Geschwindigkeit nicht nutzen.Happy Coding!
-
Hallo,
hab gerade für das englische Hilfeforum folgenden Code geschrieben, um verschiedene Farben für die einzelnen Parts einer Statusbar anzuzeigen.
Das kann sicher auch hier der/die eine oder andere gebrauchen.mfg
funkeySpoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiStatusBar.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>Global $hGUI, $hStatus
[/autoit] [autoit][/autoit] [autoit]
Global $aParts[3] = [75, 150, -1]$hGUI = GUICreate("StatusBar Set BkColor", 400, 300)
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_DRAWITEM, "_WM_DRAWITEM")
$hStatus = _GUICtrlStatusBar_Create($hGUI)
GUISetState();~ _GUICtrlStatusBar_SetBkColor($hStatus, 0x5555DD)
[/autoit] [autoit][/autoit] [autoit]_GUICtrlStatusBar_SetParts($hStatus, $aParts)
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlStatusBar_SetText($hStatus, "Part 1", 0, $SBT_OWNERDRAW)
_GUICtrlStatusBar_SetText($hStatus, "Part 2", 1, $SBT_OWNERDRAW)
_GUICtrlStatusBar_SetText($hStatus, "Part 3", 2, $SBT_OWNERDRAW)Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()Func _WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $Msg, $wParam, $lParam
Local $tDRAWITEMSTRUCT = DllStructCreate("uint CtlType;uint CtlID;uint itemID;uint itemAction;uint itemState;HWND hwndItem;HANDLE hDC;long rcItem[4];ULONG_PTR itemData", $lParam)
Local $itemID = DllStructGetData($tDRAWITEMSTRUCT, "itemID") ;part number
Local $hDC = DllStructGetData($tDRAWITEMSTRUCT, "hDC")
Local $tRect = DllStructCreate("long left;long top;long right; long bottom", DllStructGetPtr($tDRAWITEMSTRUCT, "rcItem"))
Local $iTop = DllStructGetData($tRect, "top")
Local $iLeft = DllStructGetData($tRect, "left")
Local $hBrushSwitch $itemID
[/autoit] [autoit][/autoit] [autoit]
Case 0
$hBrush = _WinAPI_CreateSolidBrush(0x555500)
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
DllStructSetData($tRect, "top", $iTop + 1)
DllStructSetData($tRect, "left", $iLeft + 1)
_WinAPI_SetTextColor($hDC, 0x00FFFF)
_WinAPI_DrawText($hDC, "Part 1", $tRect, $DT_LEFT)
_WinAPI_DeleteObject($hBrush)
Case 1
$hBrush = _WinAPI_CreateSolidBrush(0x00FF00)
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
DllStructSetData($tRect, "top", $iTop + 1)
DllStructSetData($tRect, "left", $iLeft + 1)
_WinAPI_DrawText($hDC, "Part 2", $tRect, $DT_LEFT)
_WinAPI_DeleteObject($hBrush)
Case 2
$hBrush = _WinAPI_CreateSolidBrush(0xABCDEF)
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
DllStructSetData($tRect, "top", $iTop + 1)
DllStructSetData($tRect, "left", $iLeft + 1)
_WinAPI_DrawText($hDC, "Part 3", $tRect, $DT_LEFT)
_WinAPI_DeleteObject($hBrush)
EndSwitch$tDRAWITEMSTRUCT = 0
[/autoit] [autoit][/autoit] [autoit][/autoit]
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_DRAWITEM -
[autoit]
;Version will be 0x20yx for winamp 2.yx. versions previous to Winamp 2.0,
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
;typically (but not always) use 0x1zyx for 1.zx versions. Weird, I know.Global $Version = 20579
[/autoit][autoit][/autoit][autoit]MsgBox(0, "Version", Hex($Version, 4))
[/autoit][autoit][/autoit][autoit][/autoit] -
Hat wahrschenlich was mit dem WorkingDir zu tun. wenn du Exe2 von Exe1 aus startest solltest du bei Run() auch den 2.Parameter "workingdir" mit dem Pfad der Exe2 befüllen.
-
Hallo!
Aufgrund des Threads [ offen ] Ausgehende IP erzwingen / ForceBindIP habe ich mich wieder mit einem alten Thema von mir beschäftigt und damit auch gelöst.
Anbei der Source-Code um alle Siemens Sentron Geräte im Netzwerk über UDP-Broadcast zu ermitteln.Spoiler anzeigen
[autoit]#region ;**** Directives created by AutoIt3Wrapper_GUI ****
[/autoit] [autoit][/autoit] [autoit]
#AutoIt3Wrapper_Icon=PAC.ico
#AutoIt3Wrapper_Res_Comment=Siemens Sentron-Geräte auflisten
#AutoIt3Wrapper_Res_Description=Siemens Sentron-Geräte auflisten
#AutoIt3Wrapper_Res_Fileversion=0.9
#AutoIt3Wrapper_Res_LegalCopyright=funkey 2013
#AutoIt3Wrapper_Res_Language=3079
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/striponly
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include "socket_UDF.au3"TCPStartup() ; WSAStartup
[/autoit] [autoit][/autoit] [autoit]
Global $iSock = _socket($AF_INET, $SOCK_DGRAM, $IPPROTO_UDP)
;~ ConsoleWrite("Socket: " & $iSock & @CRLF)Global $tBroadCast = DllStructCreate("int broadcast")
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tBroadCast, "broadcast", 1)Global $iSockError = _setsockopt($iSock, $SOL_SOCKET, $SO_BROADCAST, $tBroadCast) ; Broadcast erlauben
[/autoit] [autoit][/autoit] [autoit]
If $iSockError Then
ConsoleWrite("SetSockOpt error setting broadcast!. Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF)
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIfGlobal $tTimeVal = DllStructCreate("DWORD timeout")
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tTimeVal, "timeout", 200) ; Timeout von 200ms$iSockError = _setsockopt($iSock, $SOL_SOCKET, $SO_RCVTIMEO, $tTimeVal) ; Timeout für recv einstellen
[/autoit] [autoit][/autoit] [autoit]
If $iSockError Then
ConsoleWrite("SetSockOpt error setting recv timeout!. Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF)
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIfGlobal $iBind = _bind($iSock, @IPAddress1, 17009) ; Lokale IP-Adresse und Port zu verwenden
[/autoit] [autoit][/autoit] [autoit]
If $iBind Then
ConsoleWrite("Bind error: " & $iBind & @CRLF) ; 0 ist OK
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIf;~ ConsoleWrite("Lokaler Port: " & _Ws2_GetLocalPort($iSock) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Global $iConnect = _connect($iSock, "255.255.255.255", 17008) ;Broadcast auf Port 17008
[/autoit] [autoit][/autoit] [autoit]
If $iConnect Then
ConsoleWrite("Connect Error! Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF)
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIfGlobal $bToSend = Binary("0x3101FFFFFFFFFFFF") ; Sentron-Geräte meldet euch!!
[/autoit] [autoit][/autoit] [autoit]
Global $tSendBuffer = DllStructCreate("byte[" & BinaryLen($bToSend) & "]")
DllStructSetData($tSendBuffer, 1, $bToSend)Global $iSend = _send($iSock, $tSendBuffer)
[/autoit] [autoit][/autoit] [autoit]Global $tRecvBuffer = DllStructCreate("byte[512]")
[/autoit] [autoit][/autoit] [autoit]
Global $iRecv
Global $aData[1][6] = [["MAC", "IP", "Subnetmask", "Gateway", "Bestellnummer", "Infotext"]]
Global $iDevices = 0While 1
[/autoit] [autoit][/autoit] [autoit]
$iRecv = _recv($iSock, $tRecvBuffer)
If $iRecv = -1 Then ExitLoop ; Timeout$iDevices += 1
[/autoit] [autoit][/autoit] [autoit]
ReDim $aData[$iDevices + 1][6]$aData[$iDevices][5] = DllStructGetData($tRecvBuffer, 1)
[/autoit] [autoit][/autoit] [autoit]
$aData[$iDevices][0] = _BytesRecvToMAC($aData[$iDevices][5])
$aData[$iDevices][1] = _BytesRecvToIP($aData[$iDevices][5], 9)
$aData[$iDevices][2] = _BytesRecvToIP($aData[$iDevices][5], 13)
$aData[$iDevices][3] = _BytesRecvToIP($aData[$iDevices][5], 17)
$aData[$iDevices][4] = _BytesRecvToString($aData[$iDevices][5], 21, 18)
$aData[$iDevices][5] = _BytesRecvToString($aData[$iDevices][5], 41, $iRecv - 41)
WEnd_closesocket($iSock)
[/autoit] [autoit][/autoit] [autoit]
TCPShutdown() ; WSACleanup_ArraySort($aData, 0, 1, 0, 1) ; Anhand der IP-Adresse sortieren
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aData, "Gefundene Geräte")Func _BytesRecvToIP($bBytes, $iOffset)
[/autoit] [autoit][/autoit] [autoit]
Return StringFormat("%i.%i.%i.%i", BinaryMid($bBytes, $iOffset, 1), BinaryMid($bBytes, $iOffset + 1, 1), BinaryMid($bBytes, $iOffset + 2, 1), BinaryMid($bBytes, $iOffset + 3, 1))
EndFunc ;==>_BytesRecvToIPFunc _BytesRecvToMAC($bBytes)
[/autoit] [autoit][/autoit] [autoit]
Return StringFormat("%02X-%02X-%02X-%02X-%02X-%02X", BinaryMid($bBytes, 3, 1), BinaryMid($bBytes, 4, 1), BinaryMid($bBytes, 5, 1), BinaryMid($bBytes, 6, 1), BinaryMid($bBytes, 7, 1), BinaryMid($bBytes, 8, 1))
EndFunc ;==>_BytesRecvToMACFunc _BytesRecvToString($bBytes, $iStart, $iLen)
[/autoit]
Return BinaryToString(BinaryMid($bBytes, $iStart, $iLen))
EndFunc ;==>_BytesRecvToString -
Ich werde mir keines dieser Programme anschauen, aleine schon wenn ich die Größe der Programme mit minimalem Nutzen sehe, weiß ich, dass da einiges an nicht gewünschtem Zeug mitkommt.
Außerdem ist das wie bereits gesagt das falsche Forum und auch der Titel des Threads sollte SchrotterChwebnode's Programmsammlung oder so heißen. -
Du kannst das über verschiedene Varianten lösen.
Z.B über TCP-Funktionen, oder über eine temporäre Datei (Das Hauptprogramm überprüft ob die Datei vorhanden ist, löscht sie und beendet sich)
oder auch über ein verstecktes Control im Hautprogramm (Updater schreibt 'Exit' in Control, Hauptprogramm überprüft den Text des Controls, wenn es z.B. 'Exit' enthält, beendet es sich).Ich habe z.B. auch folgendes bei mir im Einsatz: Hauptprogramm.exe überprüft das Vorhandensein von Hauptprogramm.exe.update.exe. Falls vorhanden beendet es sich, benennt sich selbst über einen Batch-Befehl in Hauptprogramm.exe.old.exe um und Hauptprogramm.exe.update.exe in Hauptprogramm.exe und startet diese.

-
-
Ich habe den Fehler schon gefunden!

Aber: Wie legal ist es denn, diese API zu benützen?? -
Und meine
[autoit]
#include <String.au3>
[/autoit][autoit][/autoit][autoit]
#include <Array.au3>Global $sString = "ID1 F2 A3"
[/autoit][autoit][/autoit][autoit]$sString = _StringInsert($sString, " ", StringInStr($sString, "F") - 1)
[/autoit][autoit][/autoit][autoit]
$sString = _StringInsert($sString, " ", StringInStr($sString, "A") - 1)
$sString = StringStripWS($sString, 4)Global $aString = StringSplit($sString, " ", 3)
[/autoit][autoit][/autoit][autoit]_ArrayDisplay($aString)
[/autoit] -
So, hab mir nun das ganze angeschaut und die benötigten Funktionen nach AutoIt portiert.
Ob die IP-Adresse auch gebunden wird kann ich nicht testen, der ausgehende Port wird aber erfolgreich gebunden.
Angehängt die Funktionen und ein Beispiel, das bei mir tadellos funktioniert. Natürlich ist es auf meine Testumgebung abgestimmt. -
-
Kann es sein dass man #RequireAdmin braucht?
-
Zu spät

Aber trotzdem noch nachträglich alles Gute zu deinem Geburtstag!
Bleib so wie du bist, und bleib gesund! -
Bist du sicher dass du FileReadLine richtig benutzt?
Ich vermute mal ganz stark, dass du die Zeilennummer als zweiten Parameter einträgst und in der Schleife hochzählen lässt.
Das muss natürlich furchtbar langsam sein.
Wenn du es so machst wie im Beispiel in der Hilfe zu FileReadLine (also ohne die Zeilennummer einzutragen, sondern einfach die Datei Zeile für Zeile durchgehen) ist das ganze alles andere als langsam.Hast du das gelesen?
Du sollst den zweiten Parameter von FileReadLine() nicht verwenden! Du brauchst $Line gar nicht. -
Auf den ersten Blick hast du nur eines noch falsch gemacht.
[autoit]$Return[0] = DllStructGetData($tDismMountedImageInfo, 1)
[/autoit]
[autoit]
müsste$Return[0] = DllStructGetData($wchar, 1)
[/autoit]und
[autoit]$Return[1] = DllStructGetData($tDismMountedImageInfo, 2)
[/autoit]
[autoit]
müsste$Return[1] = DllStructGetData($wchar2, 1)
[/autoit]
heißen. -
So ungefähr hätte ich mir das vorgestellt:
Spoiler anzeigen
[autoit]$wchar = DllStructCreate("WCHAR[260]")
[/autoit] [autoit][/autoit] [autoit][/autoit]
$ptrwchar = DllStructGetPtr($wchar)
$wchar2 = DllStructCreate("WCHAR[260]")
$ptrwchar2 = DllStructGetPtr($wchar2)
Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"
Global $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2) -
PCWSTR ist eigeltlich ein Pointer auf einen WSTR. Da müsstest du einen ptr nehmen und diesen mit einem Pointer einer DllStruct aus WCHAR befüllen. Das ganze natürlich beide Male. Alles klar?
