本帖最后由 tvzml 于 2014-9-27 09:00 编辑
买了一款不熟悉的行业软件,由于对软件的不熟悉以及软件一些功能的不足,想满足客户的要求,也不可能个个要求官方增加客户的功能,动不动就要加钱增加功能呢。为了增加功能以及快速批量设置软件,于是萌生了此款数据库跟踪软件。
工作原理十分简单,第一次设置或者操作行业软件时,给数据库拍照一次,再次设置行业软件或者修改行业软件后,也就是行业软件发生了变化,如产生了新的数据或者删除了某项数据,再次点击“分析”,对比2次变化的结果,即可找出变化的字段,点击字段可以查看数据变化内容,这样就知道数据库哪些地方变化了,知道哪些关联字段的功能以后,即可随心所欲地的增加客户要求的功能了。
#NoTrayIcon
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseUpx=n
#PRE_Res_Comment=QQ:6910930
#PRE_Res_Description=数据库跟踪工具
#PRE_Res_Fileversion=1.0.0.7
#PRE_Res_Fileversion_AutoIncrement=p
#PRE_Res_LegalCopyright=Soft By Tvzml
#PRE_Res_requestedExecutionLevel=None
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <File.au3>
#include <Array.au3>
#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GuiIPAddress.au3>
#include <GuiTab.au3>
#include <EditConstants.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GuiToolBar.au3>
#include <GuiButton.au3>
#include <GuiImageList.au3>
#include <Misc.au3>
Opt("GUICloseOnESC", 0)
Opt("TrayMenuMode", 3)
AutoItSetOption("MustDeclareVars", 1)
Opt('MustDeclareVars', 1)
If _Singleton("wbrun-" & FileGetVersion(@ScriptName), 1) = 0 Then
Exit
EndIf
Local $TT_Main = "数据库跟踪工具", $Width = 620, $Height = 433, $ExitLoop = False, $HGUIFPS = 0
Local $hSocket_g = -1, $Isopen, $checkip = 0
Const $tagTIMEVAL = "long Seconds;long Microseconds"
Const $tagFD_SET = "long NumberofSockets;handle Socket[64]"
Const $tagSOCKADDR = "word Family;word Port;long Address;ubyte Zero[8]"
Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'
Local $hGUI = GUICreate($TT_Main, $Width, $Height)
GUICtrlCreateLabel("第一步:按操作面板刷新,选择数据库鼠标左击数据库名。", 75, 10, $Width - 20, 23)
GUICtrlSetColor(-1, 0xff0000)
GUICtrlCreateLabel("第二步:执行快照通过点击快照图标创建一个快照", 75, 30, $Width - 20, 23)
GUICtrlSetColor(-1, 0xff0000)
GUICtrlCreateLabel("第三步:增加或者删除数据后,单击分析图标,分析出数据库变化结果", 75, 50, $Width - 20, 23)
GUICtrlSetColor(-1, 0xff0000)
Local $tabx = 171, $taby = 77, $tabw = 442, $tabh = 337, $ConnOpen = False, $ClickTab = 1
Local $file = @ScriptDir & "\query.ini"
Local $serverdns = IniRead($file, "query", "serverdns", "localhost")
Local $serverUrl = $serverdns
Local $serverport = IniRead($file, "query", "serverport", 1433)
If Not StringIsDigit(StringReplace($serverdns, ".", "")) Then
TCPStartup()
$serverdns = TCPNameToIP($serverdns)
TCPShutdown()
EndIf
Local $SQLSERVER = $serverdns & "," & $serverport
Local $SqlDBName = IniRead($file, "query", "SqlDBName", "master")
Local $SQLUID = IniRead($file, "query", "SQLUID", "sa")
Local $SQLPWD = IniRead($file, "query", "SQLPWD", "")
Local $TCPTIMEOUT = IniRead($file, "query", "TCPTIMEOUT", 3000)
Local $SQLline = IniRead($file, "query", "SQLline", 300)
IniWrite($file, "query", "serverdns", $serverUrl)
IniWrite($file, "query", "serverport", $serverport)
IniWrite($file, "query", "SqlDBName", $SqlDBName)
IniWrite($file, "query", "SQLUID", $SQLUID)
IniWrite($file, "query", "SQLPWD", $SQLPWD)
IniWrite($file, "query", "SQLline", $SQLline)
GUICtrlCreateGroup("SQL数据库", $tabx - 166, $taby, 162, 190)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlCreateLabel("主机IP:", $tabx - 160, $taby + 25, 55, 15)
GUICtrlCreateLabel("端口Port:", $tabx - 160, $taby + 24 * 2, 55, 15)
GUICtrlCreateLabel("数据库名:", $tabx - 160, $taby + 24 * 3, 55, 15)
GUICtrlCreateLabel("用户名称:", $tabx - 160, $taby + 24 * 4, 55, 15)
GUICtrlCreateLabel("用户密码:", $tabx - 160, $taby + 24 * 5, 55, 15)
GUICtrlCreateLabel("连接超时:", $tabx - 160, $taby + 24 * 6, 55, 15)
GUICtrlCreateLabel("最大行数:", $tabx - 160, $taby + 24 * 7, 55, 15)
;GUICtrlSetBkColor(-1, 0xff0000)
Local $serverUrl_Input = GUICtrlCreateInput($serverUrl, $tabx - 105, $taby + 23, 95, 20)
Local $serverport_Input = GUICtrlCreateInput($serverport, $tabx - 105, $taby + 23 * 2, 95, 20)
Local $SqlDBName_Input = GUICtrlCreateInput($SqlDBName, $tabx - 105, $taby + 23 * 3, 95, 20)
Local $SQLUID_Input = GUICtrlCreateInput($SQLUID, $tabx - 105, $taby + 23 * 4, 95, 20)
Local $SQLPWD_Input = GUICtrlCreateInput($SQLPWD, $tabx - 105, $taby + 23 * 5, 95, 20, $ES_PASSWORD)
Local $TCPTIMEOUT_Input = GUICtrlCreateInput($TCPTIMEOUT, $tabx - 105, $taby + 23 * 6, 95, 20)
Local $SQLline_Input = GUICtrlCreateInput($SQLline, $tabx - 105, $taby + 23 * 7, 95, 20)
GUICtrlCreateGroup("操作面板 Control", $tabx - 166, $taby + 200, 162, 88)
GUICtrlSetColor(-1, 0x0000ff)
Local $Button1 = GUICtrlCreateButton("", 10, 10, 55, 55)
Local $Button2 = GUICtrlCreateButton("刷新", $tabx - 160, $taby + 25 * 9, 50, 23)
Local $OPENAll = GUICtrlCreateCheckbox("显示空数据行", $tabx - 107, $taby + 25 * 9, 100, 23)
Local $Button5 = GUICtrlCreateButton("复位", $tabx - 160, $taby + 25 * 10, 50, 23)
Local $Button6 = GUICtrlCreateButton("快照", $tabx - 110, $taby + 25 * 10, 50, 23)
Local $Button7 = GUICtrlCreateButton("分析", $tabx - 60, $taby + 25 * 10, 50, 23)
_GUICtrlButton_SetImageList($Button1, _GetImageListHandlebig("SHELL32.dll", 80, 0), 1)
_GUICtrlButton_SetImageList($Button2, _GetImageListHandle("SHELL32.dll", 209, 0), 0)
_GUICtrlButton_SetImageList($Button5, _GetImageListHandle("SHELL32.dll", 146, 0), 0)
_GUICtrlButton_SetImageList($Button6, _GetImageListHandle("SHELL32.dll", 139, 0), 0)
_GUICtrlButton_SetImageList($Button7, _GetImageListHandle("SHELL32.dll", 55, 0), 0)
GUICtrlSetState($Button1, $GUI_DISABLE)
;GUICtrlSetState($Button7, $GUI_DISABLE)
Local $TescSql = False, $ctxx_bh_chick, $ctxx_bh_chick_old, $SqlDBNameOLD
Local $ZDSQL_Db[1][1] = [[0]], $Select_Db[1][1] = [[0]], $Select_Db_mode = 0, $Count
Local $hTab = GUICtrlCreateTab($tabx, $taby, $tabw, $tabh, $TCS_MULTISELECT, $WS_EX_LAYERED)
Local $tab0 = GUICtrlCreateTabItem("日志信息")
Local $hGUIEdit = GUICtrlCreateEdit("", $tabx + 4, $taby + 23, $tabw - 8, $tabh - 30)
Local $tab1 = GUICtrlCreateTabItem("选择数据库")
Local $hListView = GUICtrlCreateListView("序号|数据库名", $tabx + 4, $taby + 23, $tabw - 8, $tabh - 30)
Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
_GUICtrlListView_SetExtendedListViewStyle($hListView, $iExListViewStyle)
_GUICtrlListView_SetColumnWidth($hListView, 0, 40)
_GUICtrlListView_SetColumnWidth($hListView, 1, 170)
Local $FCO = GUICtrlCreateContextMenu($hListView)
Local $Run0 = GUICtrlCreateMenuItem("拍照", $FCO)
Local $Run1 = GUICtrlCreateMenuItem("对比", $FCO)
Local $tab2 = GUICtrlCreateTabItem("数据跟踪")
Local $hListView1 = GUICtrlCreateListView("编号|数据表|第一次|第二次|对比结果", $tabx + 4, $taby + 23, $tabw - 8, $tabh - 30)
_GUICtrlListView_SetExtendedListViewStyle($hListView1, $iExListViewStyle)
_GUICtrlListView_SetColumnWidth($hListView1, 0, 65)
_GUICtrlListView_SetColumnWidth($hListView1, 1, 160)
_GUICtrlListView_SetColumnWidth($hListView1, 2, 65)
_GUICtrlListView_SetColumnWidth($hListView1, 3, 65)
_GUICtrlListView_SetColumnWidth($hListView1, 4, 65)
Local $FCO1 = GUICtrlCreateContextMenu($hListView1)
Local $Run3 = GUICtrlCreateMenuItem("查询数据", $FCO1)
Local $tab3 = GUICtrlCreateTabItem("数据内容")
Local $hListView2 = GUICtrlCreateListView("||||||||||||||||||||||||||||||||||||||||||||||||||||||||", $tabx + 4, $taby + 23, $tabw - 8, $tabh - 30)
Local $exititem = TrayCreateItem("退出")
TraySetState()
TraySetClick(8)
TraySetToolTip($TT_Main)
GUISetState(@SW_SHOW, $hGUI)
TraySetIcon("Shell32.dll", -172)
GUISetIcon("Shell32.dll", -172, $hGUI)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
Local $Conn
TCPStartup()
If _TescSql() Then
_ClickTab(1)
_LoingSqlAllName()
EndIf
While 1
Dim $nMsg = GUIGetMsg(1)
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
Switch $nMsg[1]
Case $hGUI
TCPShutdown()
Exit
GUISetState(@SW_HIDE, $hGUI)
EndSwitch
Case $GUI_EVENT_MINIMIZE
Switch $nMsg[1]
Case $hGUI
GUISetState(@SW_HIDE, $hGUI)
EndSwitch
Case $Button2
$ClickTab = 1
_ClickTab(1)
_LoingSqlAllName()
Case $Button5
$ClickTab = 2
_ClickTab(2)
$Select_Db_mode = 0
ReDim $Select_Db[1][1]
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView1))
Case $Button6, $Run0
$ClickTab = 2
_ClickTab(2)
$Select_Db_mode = 1
$ctxx_bh_chick = ""
_sqlpz()
Case $Button7, $Run1
$ClickTab = 2
_ClickTab(2)
$Select_Db_mode = 2
$ctxx_bh_chick = ""
_sqlpz()
Case $Run3
$Select_Db_mode = 3
AdlibRegister("_sqlpz", 1)
EndSwitch
Switch TrayGetMsg()
Case $exititem
TCPShutdown()
Exit
Case $TRAY_EVENT_PRIMARYDOWN
GUISetState(@SW_SHOW, $hGUI)
Case $TRAY_EVENT_SECONDARYDOWN
GUISetState(@SW_SHOW, $hGUI)
EndSwitch
WEnd
Func _ClickTab($mode = 0)
Dim $pos = MouseGetPos()
Dim $posx = $pos[0]
Dim $posy = $pos[1]
_GUICtrlTab_ClickTab($hTab, $mode, "left", True, 1)
MouseMove($posx, $posy, 1)
EndFunc ;==>_ClickTab
Func Echo($line = "")
Dim $time, $hGUIEdit_Str, $hGUIEdit_StrSp, $hGUIEdit_StrOK = "", $hGUIEdit_StrMax = 24, $hGUIEdit_StrEnd
$hGUIEdit_Str = GUICtrlRead($hGUIEdit)
If StringInStr($hGUIEdit_Str, @CRLF) Then
$hGUIEdit_StrSp = StringSplit($hGUIEdit_Str, @CRLF, 1)
If IsArray($hGUIEdit_StrSp) Then
Dim $hGUIEdit_Strout = UBound($hGUIEdit_StrSp) - 1
If $hGUIEdit_Strout > $hGUIEdit_StrMax Then
$hGUIEdit_StrMax = $hGUIEdit_Strout - $hGUIEdit_StrMax
Else
$hGUIEdit_StrMax = 1
EndIf
For $i = $hGUIEdit_StrMax To UBound($hGUIEdit_StrSp) - 1
$hGUIEdit_StrOK = StringReplace($hGUIEdit_StrOK, @CRLF, '^')
$hGUIEdit_StrOK = $hGUIEdit_StrOK & $hGUIEdit_StrSp[$i] & '^'
$hGUIEdit_StrOK = StringReplace($hGUIEdit_StrOK, '^^', '^')
Next
EndIf
EndIf
If $hGUIEdit_StrOK <> "" Then
$hGUIEdit_StrEnd = $hGUIEdit_StrOK & '^' & _Time() & " " & $line
Else
$hGUIEdit_StrEnd = _Time() & " " & $line
EndIf
$hGUIEdit_StrEnd = StringReplace($hGUIEdit_StrEnd, '^^', '^')
$hGUIEdit_StrEnd = _TrimStr($hGUIEdit_StrEnd, "^")
$hGUIEdit_StrEnd = StringReplace($hGUIEdit_StrEnd, '^', @CRLF)
GUICtrlSetData($hGUIEdit, $hGUIEdit_StrEnd & @CRLF)
EndFunc ;==>Echo
Func _Time()
Return @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
EndFunc ;==>_Time
Func _TrimStr($str = "", $delstr = "\")
If StringLeft($str, 1) = $delstr Then $str = StringTrimLeft($str, 1)
If StringRight($str, 1) = $delstr Then $str = StringTrimRight($str, 1)
Return $str
EndFunc ;==>_TrimStr
Func _GetModuleFileNameEx($_Pid)
Dim $_Hwnd = DllCall("Kernel32.dll", "hwnd", "OpenProcess", "dword", 0x0400 + 0x0010, "int", 0, "dword", $_Pid)
Dim $_Return = DllCall("Psapi.dll", "long", "GetModuleFileNameEx", "hwnd", $_Hwnd[0], "long", 0, "str", 0, "long", 255)
DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $_Hwnd[0])
If StringInStr($_Return[3], "\") Then Return $_Return[3]
Return ""
EndFunc ;==>_GetModuleFileNameEx
Func _TescSql()
If Not $TescSql Then
$checkip = 0
$TCPTIMEOUT = Int(GUICtrlRead($TCPTIMEOUT_Input))
$checkip = _TCPConnectEx(GUICtrlRead($serverUrl_Input), GUICtrlRead($serverport_Input), $TCPTIMEOUT, 0)
If $checkip <> 0 Then
echo("连接数据库成功..." & $checkip)
$TescSql = True
Else
echo("无法连接数据库!!!" & $checkip)
$TescSql = False
EndIf
EndIf
If $TescSql Then
Return True
Else
Return False
EndIf
EndFunc ;==>_TescSql
Func Conn_open()
If Not $ConnOpen Then
$Conn = ObjCreate("ADODB.Connection")
$Conn.open("DRIVER={SQL Server};SERVER=" & $SQLSERVER & ";UID=" & GUICtrlRead($SQLUID_Input) & ";PWD=" & GUICtrlRead($SQLPWD_Input) & ";")
If @error Then
Return 0
Else
Return 1
EndIf
$ConnOpen = True
Else
Return 1
EndIf
EndFunc ;==>Conn_open
Func _LoingSqlAllName()
If Conn_open() Then
Dim $RS = ObjCreate("ADODB.Recordset")
$RS.ActiveConnection = $Conn
$RS.Open("SELECT Name FROM Master..SysDatabases ORDER BY Name")
$Count = 0;定义一个变量用来记录查询到的数据行数
While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
If @error = 1 Then ExitLoop
ReDim $ZDSQL_Db[$Count + 1][$RS.Fields.Count + 2];数组第一维大小加1,用于存放数据
$ZDSQL_Db[$Count][0] = $Count + 1
$ZDSQL_Db[$Count][1] = $RS.Fields(0).Value
$Count += 1
$RS.movenext
WEnd
$RS.Close
$Conn.Close
$ConnOpen = False
EndIf
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView))
_GUICtrlListView_AddArray($hListView, $ZDSQL_Db)
EndFunc ;==>_LoingSqlAllName
Func _sqlpz()
AdlibUnRegister("_sqlpz")
If $ctxx_bh_chick = "" And $Select_Db_mode = 3 Then Return 0
If Conn_open() Then
$SqlDBName = GUICtrlRead($SqlDBName_Input)
If $SqlDBNameOLD <> $SqlDBName Then
$SqlDBNameOLD = $SqlDBName
ReDim $Select_Db[1][1]
$Select_Db[0][0] = 0
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView1))
_sqlpz()
Return 0
EndIf
$Conn.Execute("use " & $SqlDBName)
ObjEvent("AutoIt.Error", "ODBCJET_ErroHandler")
If $Select_Db_mode = 1 Or $Select_Db_mode = 3 Then
Dim $RS = ObjCreate("ADODB.Recordset");创建记录集对象
$RS.ActiveConnection = $Conn;设置记录集的激活链接属性来自$Conn
If $Select_Db_mode = 3 Then
ReDim $Select_Db[1][1]
$Select_Db[0][0] = 0
$RS.Open("Select top " & Int(GUICtrlRead($SQLline_Input)) & " * from " & $ctxx_bh_chick & " ")
Else
$RS.Open("Select Name FROM SysObjects Where XType='U' orDER BY Name")
EndIf
;$RS.Open("select * from ctxx ORDER BY ctxx_bh");执行Sql语句,这个语句是查询数据库中所有的库属性,并且按Name字段的数据进行排序
$Count = 1;定义一个变量用来记录查询到的数据行数
While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
If @error = 1 Then ExitLoop
If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
ReDim $Select_Db[1][$RS.Fields.Count + 4];$RS.Fields.Count为记录集查询到的字段数
For $i = 0 To $RS.Fields.Count - 1
$Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
Next
EndIf
If $Select_Db_mode = 3 Then
;If $RS.Fields(0).Value <> "" Then
ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 4];数组第一维大小加1,用于存放数据
$Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
$Select_Db[$Count][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
For $i = 0 To $RS.Fields.Count - 1
$Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
Next
$Count += 1;行数加1
;EndIf
Else
ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 4];数组第一维大小加1,用于存放数据
$Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
$Select_Db[$Count][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
For $i = 0 To $RS.Fields.Count - 1
$Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
Next
$Count += 1;行数加1
EndIf
$RS.movenext;将记录指针从当前的位置向下移一行
WEnd
$RS.Close;关闭记录集对象
EndIf
If $Select_Db_mode = 3 Then
If UBound($Select_Db) > 1 Then
_ArrayDisplay($Select_Db, "详细信息")
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView2))
_GUICtrlListView_AddArray($hListView2, $Select_Db)
EndIf
Else
For $i = 1 To UBound($Select_Db) - 1
Dim $RS = ObjCreate("ADODB.Recordset");创建记录集对象
$RS.ActiveConnection = $Conn;设置记录集的激活链接属性来自$Conn
$RS.Open("Select count(*) FROM " & $Select_Db[$i][1] & " ")
Dim $ttt = Int($RS.Fields(0).Value)
If $Select_Db_mode = 1 Then
$Select_Db[$i][2] = Int($ttt)
EndIf
If $Select_Db_mode = 2 Then
If UBound($Select_Db) > 1 Then
If $ttt > Int($Select_Db[$i][2]) Then $Select_Db[$i][4] = "↑"
If $ttt < Int($Select_Db[$i][2]) Then $Select_Db[$i][4] = "↓"
$Select_Db[$i][3] = Int($ttt)
EndIf
EndIf
;ClipPut($Select_Db[$i][0])
$RS.Close;关闭记录集对象
Next
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView1))
If GUICtrlRead($OPENAll) = 1 Then
_GUICtrlListView_AddArray($hListView1, $Select_Db)
Else
If UBound($Select_Db) > 1 Then
Dim $Select_Db1[1][1]
$Count = 1
For $i = 0 To UBound($Select_Db) - 1
If $Select_Db[$i][2] = 0 And $Select_Db[$i][3] = 0 Then
Else
Dim $UBound = UBound($Select_Db1)
ReDim $Select_Db1[$UBound + 1][5]
$Select_Db1[$UBound - 1][0] = $Count
$Select_Db1[$UBound - 1][1] = $Select_Db[$i][1]
$Select_Db1[$UBound - 1][2] = $Select_Db[$i][2]
$Select_Db1[$UBound - 1][3] = $Select_Db[$i][3]
$Select_Db1[$UBound - 1][4] = $Select_Db[$i][4]
$Count += 1
EndIf
Next
_GUICtrlListView_AddArray($hListView1, $Select_Db1)
EndIf
EndIf
EndIf
$Conn.Close
$ConnOpen = False
EndIf
EndFunc ;==>_sqlpz
;完整源码请购买以下附件↓↓↓↓↓↓↓↓↓↓
http://www.autoitx.com/forum.php ... mp;extra=#pid596007 |