renheshi 发表于 2015-5-24 06:49:36

[AU3]Backup Switch Config

  原因:网上找一个备份交换机的软件,竟然要钱,,晕晕。。还不如自己写一个。
  通过tftp备份交换机,支持cisco huawei h3c,只完成基本功能,界面之类的大家可以扩展 ,命令里支持正则表达式。效果如图
  

  
  ;by onepc 153785587
  #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#Include
#include
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=f:\myziliao\2011-8-3\au3\telnet\form1.kxf
;HKEY_CURRENT_USER\Software\Cisco Systems Inc.\Cisco TFTP Server\1.1\Options TFTPRootDirectory tftp保存的路径 LogFileName日志名称(TFTPServer.log)需要带名称  reg_sz
;Global $switchname="onepc"
Global $hTreeView,$iContext,$hContext,$menudel,$menuexit,$ArrItem,$k=0 ;设置数据保存treeview的item句柄 $k表示数组的数量
;Global $k1 = 0,$ArrTree
Global $cfg = @ScriptDir & "\cfg.ini"
;Global $maincfg = @ScriptDir & "\maincfg.ini"
Global $swcfg = @ScriptDir & "\Switch\"
Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS)
;$ArrTree = $k1 ;根节点
$ArrItem= $k ;根的子节点
;If Not FileExists($maincfg) Then
; _CreateIniCfg($maincfg,1)
;EndIf
;_LoadINI($maincfg) ;读取tftp user pass
$Form1 = GUICreate("BackSwitch", 513, 341, -1, -1,-1,$WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, "GuiEvent")
$hTreeView = GUICtrlCreateTreeView(8, 8, 161, 321,$iStyle, $WS_EX_CLIENTEDGE)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Group1 = GUICtrlCreateGroup("", 176, 56, 329, 89)
$Label1 = GUICtrlCreateLabel("Switchip", 192, 82, 54, 17)
$Input1 = GUICtrlCreateInput("", 248, 78, 241, 21)
$Input6 = GUICtrlCreateInput("", 247, 110, 113, 21)
$Button1 = GUICtrlCreateButton("Backup",367, 108, 59, 25)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Button3 = GUICtrlCreateButton("BackAll", 432, 108, 59, 25)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Label2 = GUICtrlCreateLabel("SwitchM", 192, 112, 53, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Add Switch", 176, 152, 329, 177)
$Label3 = GUICtrlCreateLabel("Switchip", 200, 232, 52, 17)
$Label4 = GUICtrlCreateLabel("SwitchName", 192, 200, 64, 17)
$Button2 = GUICtrlCreateButton("AddSwitch", 416, 296, 75, 25)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Label5 = GUICtrlCreateLabel("Address", 200, 176, 42, 17)
$Input4 = GUICtrlCreateInput("", 272, 168, 217, 21)
$Label6 = GUICtrlCreateLabel("SwitchMode", 192, 264, 63, 17)
$Input5 = GUICtrlCreateInput("", 272, 232, 217, 21)
$Combo1 = GUICtrlCreateCombo("", 272, 264, 137, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Cisco|Huawei|H3C", "Cisco")
$Input2 = GUICtrlCreateInput("", 272, 200, 217, 21)
$Input3 = GUICtrlCreateInput("", 216, 294, 73, 21)
$Input7 = GUICtrlCreateInput("", 328, 294, 73, 21)
$Label7 = GUICtrlCreateLabel("U", 200, 296, 12, 17)
$Label8 = GUICtrlCreateLabel("P", 304, 296, 11, 17)
$Checkbox1 = GUICtrlCreateCheckbox("Privilege", 424, 264, 73, 17)
GUICtrlSetState($Checkbox1,$GUI_CHECKED)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("", 176, 2, 329, 49)
$Button4 = GUICtrlCreateButton("Start", 336, 16, 43, 25)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Button5 = GUICtrlCreateButton("Stop", 384, 16, 43, 25)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Button6 = GUICtrlCreateButton("BackupPath", 432, 16, 67, 25)
GUICtrlSetOnEvent(-1, "GuiEvent")
$Input8 = GUICtrlCreateInput(@IPAddress1, 224, 18, 105, 21)
$Label9 = GUICtrlCreateLabel("TFTP", 192, 21, 31, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
If Not FileExists($cfg) Then
    _CreateIniCfg($swcfg & "192.168.15.196" &".txt",11,"root","wen")
    _CreateIniCfg($cfg,2,"","","机房大楼", "Switch196","192.168.15.196","Cisco")   
EndIf
_InitTreeView($hTreeView,$cfg)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
;$Menu = _GUICtrlMenu_CreatePopup()
;_GUICtrlMenu_InsertMenuItem($Menu, 0, "删除", $menudel)
;_GUICtrlMenu_InsertMenuItem($Menu, 1, "退出", $menuexit)
$iContext = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
$hContext = GUICtrlGetHandle($iContext)
$menudel = GUICtrlCreateMenuItem("删除", $iContext)
$menuexit = GUICtrlCreateMenuItem("退出", $iContext)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
    Sleep(100)
WEnd
Func GuiEvent()
      Switch @GUI_CtrlId
            Case $GUI_EVENT_CLOSE
                _StopTFTP() ;关闭ftp
                Exit
            Case $Button1 ;backup
                _ExistsTFTP()
                _BackupSwitch(GUICtrlRead($Input1),GUICtrlRead($Input6),$swcfg & GUICtrlRead($Input1) & ".txt")
            Case $Button2 ;addswitch
                If GUICtrlRead($Input4)="" Or GUICtrlRead($Input2)="" Or GUICtrlRead($Input5)="" Then
                  MsgBox(0,"提示","请全部填写")
                  Return
                EndIf
                Switch GUICtrlRead($Combo1)
                  Case "Cisco"
                        _CreateIniCfg($swcfg & GUICtrlRead($Input5) &".txt",11,GUICtrlRead($Input3),GUICtrlRead($Input7))
                        _CreateIniCfg($cfg,2,"","",GUICtrlRead($Input4), GUICtrlRead($Input2), GUICtrlRead($Input5),GUICtrlRead($Combo1));_CreateIniCfg($path,$main = 0,$user="",$pass="",$swadd="",$swname="",$swi="",$swmo="")
                  Case "Huawei"
                        _CreateIniCfg($swcfg & GUICtrlRead($Input5) &".txt",12,GUICtrlRead($Input3),GUICtrlRead($Input7))
                        _CreateIniCfg($cfg,2,"","",GUICtrlRead($Input4), GUICtrlRead($Input2), GUICtrlRead($Input5),GUICtrlRead($Combo1))   
                  Case "H3C"
                        _CreateIniCfg($swcfg & GUICtrlRead($Input5) &".txt",13,GUICtrlRead($Input3),GUICtrlRead($Input7))
                        _CreateIniCfg($cfg,2,"","",GUICtrlRead($Input4), GUICtrlRead($Input2), GUICtrlRead($Input5),GUICtrlRead($Combo1))   
                EndSwitch
                _InitTreeView($hTreeView,$cfg)
            Case $Button3
                ;$xxx = _MySimpleEncry( _Base64Encode("onepc"))
                ;MsgBox(0,"",$xxx )
                ;MsgBox(0,"",BinaryToString(_Base64Decode(_MySimpleDeEncry($xxx))) )
            Case $Button4 ;starttftp
                _StartTFTP()
            Case $Button5
                _StopTFTP()
            Case $Button6 ;backuppath
                _SetBackupPath()
            
      EndSwitch
EndFunc
Func _InitTreeView($handTree,$path) ;初始化
    Local $i,$SectionName,$SecValue,$j,$item
    _GUICtrlTreeView_DeleteAll($handTree)
    _GUICtrlTreeView_BeginUpdate($handTree)
    $SectionName = IniReadSectionNames($path) ;所以字段名
    If @error Then
      MsgBox(4096, "", "错误, 读取INI文件失败.")
      exit
    Else
      For $i = 1 To $SectionName
            ;$k1 = $k1+1
            ;If $k1 telnet开始
    TCPStartup()
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $socket = TCPConnect($swip, 23) ;固定23,因为用的是telnet
    If $socket = -1 Then
      MsgBox(0,"Connect Error","连接交换机ip地址出错")
      Return
    EndIf
    Sleep($sleep)
    ;$recvstr = TCPRecv($socket,4096) ;返回telnet接受的数据
    ;;;;================================================
    Switch $swmode
      Case "Cisco"
            $iniresult=IniReadSection($path,$swmode) ;从ini读取交换机型号的模板
                For $i=1 To $iniresult ;存放的是个数 关键字=$var[$i] 值=$var[$i]
                  Sleep($sleep)
                  $recvstr = _ReadEndLine(TCPRecv($socket,4096))
                  ;MsgBox(0,"",$recvstr)
                  ;MsgBox(0,$iniresult[$i],$iniresult[$i])
                  Sleep($sleep)
                  If StringRegExp($recvstr,"(?i)" & $iniresult[$i],0) Then
                        Switch $iniresult[$i] ;左边的命令,当user pass 等固定的字符串时会执行别的命令 user pass tftpip backname
                            Case "user"
                              TCPSend($socket, $swuser & @CRLF) ;发送用户名
                              Sleep($sleep)
                            Case "pass"                  
                              TCPSend($socket, $swpass & @CRLF) ;发送密码
                              Sleep($sleep)
                            Case "tftpip"                  
                              TCPSend($socket, $tftp & @CRLF) ;发送tftp ip address
                              Sleep($sleep)                        
                            Case "backname"                  
                              TCPSend($socket, $swip & @HOUR & @MIN & @SEC & ".txt" & @CRLF) ;发送 文件名 @YEAR & @MON & @MDAY
                              Sleep($sleep)                           
                            Case Else ;其它
                              TCPSend($socket, $iniresult[$i] & @CRLF)
                              Sleep($sleep)
                        EndSwitch
                  EndIf
                Next
      Case "Huawei"
            $iniresult=IniReadSection($path,$swmode) ;从ini读取交换机型号的模板
                For $i=1 To $iniresult   
                  Sleep($sleep)
                  $recvstr = _ReadEndLine(TCPRecv($socket,4096))
                  ;MsgBox(0,"",$recvstr)
                  ;MsgBox(0,$iniresult[$i],$iniresult[$i])
                  Sleep($sleep)
                  If StringRegExp($recvstr,"(?i)" & $iniresult[$i],0) Then ;右边可以正则表达式
                        Switch $iniresult[$i] ;左边的关键值
                            Case "user"
                              TCPSend($socket, $swuser & @CRLF) ;发送用户名
                              Sleep($sleep)
                            Case "pass"                  
                              TCPSend($socket, $swpass & @CRLF) ;发送密码
                              Sleep($sleep)
                            Case Else ;其它
                              If StringRegExp($iniresult[$i],"(?i)tftp",0) Then ;即是最后一条 tftp上传命令
                                    TCPSend($socket,StringRegExpReplace(StringRegExpReplace($iniresult[$i],"serviceip",$tftp),"desfile",$swip & @HOUR & @MIN & @SEC & ".txt") & @CRLF)
                              Else
                                    TCPSend($socket, $iniresult[$i] & @CRLF)
                                    Sleep($sleep)
                              EndIf
                        EndSwitch
                  EndIf
                Next
      Case "H3C"
            $iniresult=IniReadSection($path,$swmode) ;从ini读取交换机型号的模板
            For $i=1 To $iniresult   
                Sleep($sleep)
                $recvstr = _ReadEndLine(TCPRecv($socket,4096))   
                Sleep($sleep)
                If StringRegExp($recvstr,"(?i)" & $iniresult[$i],0) Then
                        Switch $iniresult[$i] ;左边的关键值
                            Case "user"
                              TCPSend($socket, $swuser & @CRLF) ;发送用户名
                              Sleep($sleep)
                            Case "pass"                  
                              TCPSend($socket, $swpass & @CRLF) ;发送密码
                              Sleep($sleep)
                            Case "crlf"   
                              TCPSend($socket, @CRLF) ;发送回车
                              Sleep($sleep)                              
                            Case Else ;其它
                              If StringRegExp($iniresult[$i],"(?i)tftp",0) Then ;即是最后一条 tftp上传命令
                                    TCPSend($socket,StringRegExpReplace(StringRegExpReplace($iniresult[$i],"serviceip",$tftp),"desfile",$swip & @HOUR & @MIN & @SEC & ".txt") & @CRLF)
                              Else
                                    TCPSend($socket, $iniresult[$i] & @CRLF)
                                    Sleep($sleep)
                              EndIf
                        EndSwitch                  
                EndIf
            Next
               
    EndSwitch            
   
   
    ;检查是否完成 开始只备份思科的,后来加入华为,所以这里需要改。比如华为交换机那里这里完成的标志是[\w]这种格式。
    $check = 50
    While $check
      $recvstr = _ReadEndLine(TCPRecv($socket,4096))
      If StringRegExp($recvstr,"(?i)\w#",0) Then
            ExitLoop
      EndIf
      Sleep($sleep)
      $check = $check -1
    WEnd
    ;MsgBox(0,"",$check)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;关闭连接
    TCPCloseSocket($Socket)
    TCPShutdown()
    GUICtrlSetState($Button1,$GUI_ENABLE)
EndFunc
Func _ReadEndLine($str) ;返回从tcprecv接收到的数据最后一行字符串
    Local $resarr
    $resarr = StringSplit($str,@CRLF)
    Return $resarr[$resarr]
EndFunc
;Func _LoadINI($path) ;读取一些tftp地址 用户与密码
; $tftp = IniRead($path,"main","tftp","")
; $user = IniRead($path,"main","user","")
; $pass = IniRead($path,"main","pass","")
; If $tftp ="" Or $user="" Or $pass="" Then
; MsgBox(0,"Error","请配置tftp,user,pass")
; Exit
; EndIf
;EndFunc
Func _ExistsTFTP()
    Local $process = "TFTPServer.exe"
    Local $PID = ProcessExists($process)
    If Not $PID Then
      _StartTFTP()
    EndIf
EndFunc
Func _StartTFTP()
    Local $path = @ScriptDir & "\TFTPServer\TFTPServer.exe"
    ;Local $check = 10
    Local $process = "TFTPServer.exe"
    Local $PID; = ProcessExists($process)
    ;Local $winname
    ;GUICtrlSetState($Button4,$GUI_DISABLE)
    If Not FileExists($path) Then
      MsgBox(0,"Error","请检查TFTPServer文件夹下是否有TFTPServer.exe文件")
      Return
    EndIf
    Run($path)
    Sleep(500)
    ;While $check
    ; $PID = ProcessExists($process)
    ; Sleep(200)
    ; If $PID Then
    ; $winname=_WinGetByPID($PID)
    ; Sleep(200)
    ; WinSetState($winname, "", @SW_HIDE)
    ; ExitLoop
    ; EndIf
    ; $check = $check -1
    ;WEnd
    ;MsgBox(0,"","dd")
    ;GUICtrlSetState($Button4,$GUI_ENABLE)
EndFunc
Func _StopTFTP()
    Local $process = "TFTPServer.exe"
    Local $PID = ProcessExists($process)
    If $PID Then
      ProcessClose($PID)
    EndIf
EndFunc
Func _SetBackupPath() ;备份路径
    Local $regpath = "HKEY_CURRENT_USER\Software\Cisco Systems Inc.\Cisco TFTP Server\1.1\Options"
    ;Local $process = "TFTPServer.exe"
    ;Local $PID = ProcessExists($process)
    ;If $PID Then
    ; ProcessClose($PID)
    ;EndIf
    Local $path = FileSelectFolder("选择交换机配置保存文件夹.", "", 1)
    If $path"" Then
      _StopTFTP()
      RegWrite($regpath,"TFTPRootDirectory","REG_SZ",$path) ;TFTPRootDirectory
      _StartTFTP()
    EndIf
EndFunc
Func _WinGetByPID($iPID, $nArray = 1);0 will return 1 base array; leaving it 1 will return the first visible window it finds
    If IsString($iPID) Then $iPID = ProcessExists($iPID)
    Local $aWList = WinList(), $sHold
    For $iCC = 1 To $aWList
      If WinGetProcess($aWList[$iCC]) = $iPID And _
            BitAND(WinGetState($aWList[$iCC]), 2) Then
            If $nArray Then Return $aWList[$iCC]
            $sHold &= $aWList[$iCC] & Chr(1)
      EndIf
    Next
    If $sHold Then Return StringSplit(StringTrimRight($sHold, 1), Chr(1))
    Return SetError(1, 0, 0)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview,$h,$sname,$saddr ,$mche
    $hWndTreeview = $hTreeView
    If Not IsHWnd($hTreeView) Then $hWndTreeview = GUICtrlGetHandle($hTreeView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
      Case $hWndTreeview
            Switch $iCode
                Case $NM_CLICK ; The user has clicked the left mouse button within the control
                  
                  Return 0 ; zero to allow the default processing
                Case $NM_DBLCLK ; The user has double-clicked the left mouse button within the control
                  For $h =1 To $ArrItem
                        If _GUICtrlTreeView_GetSelected($hTreeView, $ArrItem[$h]) Then
                            $saddr = _GUICtrlTreeView_GetText($hTreeView, _GUICtrlTreeView_GetParentHandle($hTreeView,$ArrItem[$h]));从子节点读取到根节点
                            $sname = _GUICtrlTreeView_GetText($hTreeView, $ArrItem[$h])
                            ;$switchname = $sname
                            _GetINIinfo($cfg,$saddr,$sname)
                        EndIf
                  Next
                  
                  Return 0 ; zero to allow the default processing
                Case $NM_RCLICK ; The user has clicked the right mouse button within the control
                  ;MsgBox(0,"","Rigth")
                  ;$mche = _GUICtrlMenu_TrackPopupMenu($Menu, $hWndTreeview, -1, -1, 1, 1, 2)
                  ;If $mche0 Then
                  ; If $mche = $menudel Then
                  ; MsgBox(0,"","")
                  ; EndIf
                  ;EndIf
                $mche = _GUICtrlMenu_TrackPopupMenu($hContext, $hWndTreeview, -1, -1, 1, 1, 2)
                If ($mche0) Then
                  Switch $mche
                        Case $menudel
                            ;
                           
                        Case $menuexit
                            Exit
                  EndSwitch
                EndIf
                  Return 0 ; zero to allow the default processing
                Case $NM_RDBLCLK ; The user has clicked the right mouse button within the control
                  Return 0 ; zero to allow the default processing
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func _MySimpleEncry($string)
    Local $i,$rstr = ""
    Local $arraytemp = _StringToArray($string)
    ;_ArrayDisplay($a)
    For $i=0 To UBound($arraytemp)-1
         ;MsgBox(0,"",$arraytemp[$i])
         ;MsgBox(0,"",chr(Asc($arraytemp[$i])+10) ) ;转换成assci码的值加上10,再转成字符
         $rstr = $rstr & ChrW(Asc($arraytemp[$i])+2)
   Next   
   Return $rstr
EndFunc
Func _MySimpleDeEncry($string)
    Local $i,$rstr = ""
    Local $arraytemp = _StringToArray($string)
    For $i=0 To UBound($arraytemp)-1
      $rstr = $rstr & ChrW(Asc($arraytemp[$i])-2)
    Next   
    ;MsgBox(0,"",$rstr)
    Return $rstr
EndFunc
Func _StringToArray($str)
      Local $array,$c   ;$c为转换的中间字符
      $length=StringLen($str)      
      $c=StringMid($str,1,1)
      $array=$c
      If $length>1 Then
                For $i=2 To $length
                        $c=StringMid($str,$i,1)
                        _ArrayAdd($array,$c)
                Next
      EndIf
      Return $array
EndFunc
Func _Base64Decode($Data)
      Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F08B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC884435F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A46038847028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"
      
      Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
      DllStructSetData($CodeBuffer, 1, $Opcode)
      Local $Ouput = DllStructCreate("byte[" & BinaryLen($Data) & "]")
      Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
                                                                                                      "str", $Data, _
                                                                                                      "ptr", DllStructGetPtr($Ouput), _
                                                                                                      "int", 0, _
                                                                                                      "int", 0)
      Return BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret)
EndFunc
Func _Base64Encode($Data, $LineBreak = 76)
      Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E5BC9C21000"
      Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
      DllStructSetData($CodeBuffer, 1, $Opcode)
      $Data = Binary($Data)
      Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]")
      DllStructSetData($Input, 1, $Data)
      $LineBreak = Floor($LineBreak / 4) * 4
      Local $OputputSize = Ceiling(BinaryLen($Data) * 4 / 3)
      $OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4
      Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
      DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
                                                                                        "ptr", DllStructGetPtr($Input), _
                                                                                        "int", BinaryLen($Data), _
                                                                                        "ptr", DllStructGetPtr($Ouput), _
                                                                                        "uint", $LineBreak)
      Return DllStructGetData($Ouput, 1)
EndFunc
页: [1]
查看完整版本: [AU3]Backup Switch Config