找回密码
 加入
搜索
查看: 5359|回复: 22

[AU3基础] AU3新旧版本 语法问题请教

  [复制链接]
发表于 2018-8-17 10:52:37 | 显示全部楼层 |阅读模式
1.新版本 Local$aArray[0][0]
旧版本 V3.3.8 无法接受 这个写法 要怎么改 才能 让旧版接受?





2. 新版本 下面的语法  
        For $i = 0 To UBound($aMax) - 1
            $tData = DllStructCreate("wchar[260]", DllStructGetData($AppInfoData, $aMax[$i] + 2))
            $sData = DllStructGetData($tData, 1)
            If $aMax[$i] = 13 Then $sData = StringMid($sData, 7, 2) & "/" & StringMid($sData, 5, 2) & "/" & StringMid($sData, 1, 4)
            $aArray[$iF - 1][$i] = ($sData = "0") ? "" : $sData
            DllStructSetData($tData, 1, "")
        Next

是改成
   IF $aArray[$iF - 1][$i] = ($sData = "0") THEN  
    $sData="" 
   
   Else 
    $sData=$sData
   EndIf

還是 改成

   IF $aArray[$iF - 1][$i] = ($sData = "0") THEN  
   $aArray[$iF - 1][$i]="" 
   
   Else 
    $aArray[$iF - 1][$i]=$sData
   EndIf








发表于 2018-8-17 10:55:59 | 显示全部楼层
本帖最后由 afan 于 2018-8-17 11:14 编辑

是不支持三目语法
下面的写法还是要改一下……
 楼主| 发表于 2018-8-17 10:59:46 | 显示全部楼层
afan 发表于 2018-8-17 10:55
是不支持三目语法
下面的写法是对的

A simple example of listing installed applications using ObjCreateInterface.

官方網站 的 例子  我需要這個 含函數  列出 所有軟體  但是我想使用舊版的 V3.3.8版的  但是 函數 新寫法 不支援

老大 是否可以幫忙改一下  我好從這裏面 去理解我剛剛問題的 差異性

;Danyfirex 06/09/2014
#include <Array.au3>

Opt("MustDeclareVars", 1)

Global Const $sTagAppInfoData = "UINT cbSize;UINT dwMask;ptr pszDisplayName;ptr pszVersion;ptr pszPublisher;ptr pszProductID;" & _
        "ptr pszRegisteredOwner;ptr pszRegisteredCompany;ptr pszLanguage;ptr pszSupportUrl;ptr pszSupportTelephone;" & _
        "ptr pszHelpLink;ptr pszInstallLocation;ptr pszInstallSource;ptr pszInstallDate;ptr pszContact;ptr pszComments;" & _
        "ptr pszImage;ptr pszReadmeUrl;ptr pszUpdateInfoUrl"

Global Const $sCLSID_EnumInstalledApps = "{0B124F8F-91F0-11D1-B8B5-006008059382}"
Global Const $sIID_IEnumInstalledApps = "{1BC752E1-9046-11D1-B8B3-006008059382}"
Global Const $sTagIEnumInstalledApps = "Next hresult(ptr*);Reset hresult();"

Global Const $sIID_IShellApp = "{A3E14960-935F-11D1-B8B8-006008059382}"
Global Const $sShellApp = "GetAppInfoData hresult(ptr);"

Global Const $AIM_DISPLAYNAME = 0x00000001
Global Const $AIM_VERSION = 0x00000002
Global Const $AIM_PUBLISHER = 0x00000004
Global Const $AIM_PRODUCTID = 0x00000008
Global Const $AIM_REGISTEREDOWNER = 0x00000010
Global Const $AIM_REGISTEREDCOMPANY = 0x00000020
Global Const $AIM_LANGUAGE = 0x00000040
Global Const $AIM_SUPPORTURL = 0x00000080
Global Const $AIM_SUPPORTTELEPHONE = 0x00000100
Global Const $AIM_HELPLINK = 0x00000200
Global Const $AIM_INSTALLLOCATION = 0x00000400
Global Const $AIM_INSTALLSOURCE = 0x00000800
Global Const $AIM_INSTALLDATE = 0x00001000
Global Const $AIM_CONTACT = 0x00004000
Global Const $AIM_COMMENTS = 0x00008000
Global Const $AIM_IMAGE = 0x00020000
Global Const $AIM_READMEURL = 0x00040000
Global Const $AIM_UPDATEINFOURL = 0x00080000





Local $aArray = GetInstalledApps(BitOR($AIM_DISPLAYNAME, $AIM_INSTALLDATE))
_ArrayDisplay($aArray, "GetInstalledApps", Default, Default, Default, "NAME|INSTALLDATE")
$aArray = GetInstalledApps(BitOR($AIM_DISPLAYNAME, $AIM_UPDATEINFOURL))
_ArrayDisplay($aArray, "GetInstalledApps", Default, Default, Default, "DISPLAYNAME|UPDATEINFOURL")
$aArray = GetInstalledApps(BitOR($AIM_DISPLAYNAME, $AIM_INSTALLDATE, $AIM_INSTALLLOCATION))
_ArrayDisplay($aArray, "GetInstalledApps", Default, Default, Default, "DISPLAYNAME|INSTALLLOCATION|INSTALLDATE")

Func GetInstalledApps($iMask = $AIM_DISPLAYNAME)

    Local $oEnumInstalledApps = ObjCreateInterface($sCLSID_EnumInstalledApps, $sIID_IEnumInstalledApps, $sTagIEnumInstalledApps)
    If @error Then Return 0
    Local $pShellApp = 0
    Local $oShellApp = 0
    Local $AppInfoData = DllStructCreate($sTagAppInfoData)
    Local $pAppInfoData = DllStructGetPtr($AppInfoData)
    Local $i = 0
    Local $aArray[0][0]
    Local $iF = 1
    Local $tData = 0
    Local $sData = ""
    Local $aMax = nCol($iMask)


    While $oEnumInstalledApps.Next($pShellApp) = 0 And $pShellApp <> 0
        $oShellApp = ObjCreateInterface($pShellApp, $sIID_IShellApp, $sShellApp)
        If @error Then Return 0

        DllStructSetData($AppInfoData, "cbSize", DllStructGetSize($AppInfoData))
        DllStructSetData($AppInfoData, "dwMask", $iMask)

        $oShellApp.GetAppInfoData($pAppInfoData)

        ReDim $aArray[$iF][UBound($aMax)]

        For $i = 0 To UBound($aMax) - 1
            $tData = DllStructCreate("wchar[260]", DllStructGetData($AppInfoData, $aMax[$i] + 2))
            $sData = DllStructGetData($tData, 1)
            If $aMax[$i] = 13 Then $sData = StringMid($sData, 7, 2) & "/" & StringMid($sData, 5, 2) & "/" & StringMid($sData, 1, 4)
            $aArray[$iF - 1][$i] = ($sData = "0") ? "" : $sData
            DllStructSetData($tData, 1, "")
        Next

        $oShellApp = Null
        $iF += 1
    WEnd
    $oEnumInstalledApps = Null
    Return $aArray

EndFunc   ;==>GetInstalledApps



Func nCol($iMask)
    Local $aFlag[18] = [$AIM_DISPLAYNAME, $AIM_VERSION, $AIM_PUBLISHER, $AIM_PRODUCTID, $AIM_REGISTEREDOWNER, $AIM_REGISTEREDCOMPANY, _
            $AIM_LANGUAGE, $AIM_SUPPORTURL, $AIM_SUPPORTTELEPHONE, $AIM_HELPLINK, $AIM_INSTALLLOCATION, $AIM_INSTALLSOURCE, _
            $AIM_INSTALLDATE, $AIM_CONTACT, $AIM_COMMENTS, $AIM_IMAGE, $AIM_READMEURL, $AIM_UPDATEINFOURL]
    Local $iCol = 0
    Local $x = 0
    Local $aCol[18]
    For $i = 0 To UBound($aFlag) - 1
        If BitAND($iMask, $aFlag[$i]) Then
            $aCol[$x] = $i + 1
            $x += 1
        EndIf
    Next
    ReDim $aCol[$x]
    Return $aCol
EndFunc   ;==>nCol

发表于 2018-8-17 11:04:28 | 显示全部楼层
            If $sData = "0" Then
                                $aArray[$iF - 1][$i] = ""
                        Else
                                $aArray[$iF - 1][$i] = $sData
                        EndIf
 楼主| 发表于 2018-8-17 11:10:43 | 显示全部楼层

這樣改 過不了  我 使用新版  使用我剛剛舊版的語法 抓不到資料   換成新版語法就可以抓到資料.....

发表于 2018-8-17 11:12:26 | 显示全部楼层
kk_lee69 发表于 2018-8-17 11:10
這樣改 過不了  我 使用新版  使用我剛剛舊版的語法 抓不到資料   換成新版語法就可以抓到資料.....

那就不是语法问题了,可能是 ObjCreateInterface 这个实验性函数引起的,我这运行报错
 楼主| 发表于 2018-8-17 11:20:53 | 显示全部楼层
本帖最后由 kk_lee69 于 2018-8-17 11:22 编辑
afan 发表于 2018-8-17 11:12
那就不是语法问题了,可能是 ObjCreateInterface 这个实验性函数引起的,我这运行报错

找到了  $tData=""  或者 $tData=$sData

這樣就可以了  感謝 幫忙   另外請問

第一個問題  新版的 Local$aArray[0][0]

意義是指  是個 數組 但是 沒有任何 一筆資料  只是定義是個二組數組嗎??

那舊版的要怎麼定義
发表于 2018-8-17 11:26:18 | 显示全部楼层
kk_lee69 发表于 2018-8-17 11:20
找到了  $tData=""  或者 $tData=$sData

這樣就可以了  感謝 幫忙   另外請問

我没用新版,我是3.3.14.2。新版支持这种写法应该是你理解的,是数组,也定义了维度,只是没填充任何数据
 楼主| 发表于 2018-8-17 11:35:25 | 显示全部楼层
afan 发表于 2018-8-17 11:26
我没用新版,我是3.3.14.2。新版支持这种写法应该是你理解的,是数组,也定义了维度,只是没填充任何数据

恩  剛剛上面應該是我搞錯了 我在測試看看 呵呵
发表于 2018-8-17 11:47:26 | 显示全部楼层
kk_lee69 发表于 2018-8-17 11:35
恩  剛剛上面應該是我搞錯了 我在測試看看 呵呵

你可以试试改成

    Local $aArray[1][2]
    Local $iF = 1
    Local $tData = 0
    Local $sData = ""
    Local $aMax = nCol($iMask)

    While $oEnumInstalledApps.Next($pShellApp) = 0 And $pShellApp <> 0
        $oShellApp = ObjCreateInterface($pShellApp, $sIID_IShellApp, $sShellApp)
        If @error Then Return 0

        DllStructSetData($AppInfoData, "cbSize", DllStructGetSize($AppInfoData))
        DllStructSetData($AppInfoData, "dwMask", $iMask)

        $oShellApp.GetAppInfoData($pAppInfoData)
       If $iF > 0 And UBound($aMax) > 1 Then
        ReDim $aArray[$iF][UBound($aMax)]

        For $i = 0 To UBound($aMax) - 1
            $tData = DllStructCreate("wchar[260]", DllStructGetData($AppInfoData, $aMax[$i] + 2))
            $sData = DllStructGetData($tData, 1)
            If $aMax[$i] = 13 Then $sData = StringMid($sData, 7, 2) & "/" & StringMid($sData, 5, 2) & "/" & StringMid($sData, 1, 4)
            If $sData = "0" Then
                                $aArray[$iF - 1][$i] = ""
                        Else
                                $aArray[$iF - 1][$i] = $sData
                        EndIf
            DllStructSetData($tData, 1, "")
        Next
        EndIf
        $oShellApp = Null
        $iF += 1
    WEnd
发表于 2018-8-17 11:48:55 | 显示全部楼层
我在旧版本 V3.3.8.1版(支持Win2000版)试过是不支持  Local $aArray[0][0] 写法,我只能Local $aArray[1][1],完后再调整数组维度。
发表于 2018-8-17 13:06:47 | 显示全部楼层
kk_lee69 发表于 2018-8-17 11:35
恩  剛剛上面應該是我搞錯了 我在測試看看 呵呵

我在
>"D:\AutoIt3394\SciTe\ACNWrapper\ACNWrapper.exe" /run /ErrorStdOut /in "D:\AU3调试\kk_lee69\AU3新旧版本 语法问题.au3" /autoit3dir "D:\AutoIt3394" /UserParams   
+>13:03:01 开始执行 ACNWrapper v.1.0.3.1测试结果



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2018-8-17 13:14:55 | 显示全部楼层
chzj589 发表于 2018-8-17 13:06
我在
>"D:\AutoIt3394\SciTe\ACNWrapper\ACNWrapper.exe" /run /ErrorStdOut /in "D:\AU3调试\kk_lee69\ ...

找出來了

第一個問題 使用 Local$aArray[1][1]

就可以

第二個問題 改成 下面就可以

                        IF $sData = "0" THEN  
                                $aArray[$iF - 1][$i]="" 
                        Else 
                                $aArray[$iF - 1][$i]=$sData
                        EndIf
发表于 2018-8-17 15:47:26 | 显示全部楼层
kk_lee69 发表于 2018-8-17 13:14
找出來了

第一個問題 使用 Local$aArray[1][1]

把版本与大小容量抓出来就好玩了





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2018-8-17 20:51:48 | 显示全部楼层
chzj589 发表于 2018-8-17 15:47
把版本与大小容量抓出来就好玩了

可以抓出版本 廠商

大小沒辦法
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-28 22:44 , Processed in 0.094038 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表