- Сообщения
- 8,673
- Репутация
- 2,486
Пример использования функции получения свойств и методов объекта.
Имеется три метода для получения свойств и методов объекта:
1) _ObjGetMembersVBS - использует VBS скрипт и объект TLI.TLIApplication (в недавних версиях AutoIt он не работает).
2) _ObjGetMembersPS - использует PowerShell скрипт.
3) _ObjGetMembersDllExp - использует утилиту Dll Export Viewer.
Обратите внимание, для использования версии с VBS нужно запускать AutoIt скрипт как x86, иначе может не работать.
* Версия на чистом AutoIt (исходник + скомпил. версия), работает только для AutoIt 3.3.6.1 и 3.3.8.1.
Имеется три метода для получения свойств и методов объекта:
1) _ObjGetMembersVBS - использует VBS скрипт и объект TLI.TLIApplication (в недавних версиях AutoIt он не работает).
2) _ObjGetMembersPS - использует PowerShell скрипт.
3) _ObjGetMembersDllExp - использует утилиту Dll Export Viewer.
Код:
#include <Array.au3>
#AutoIt3Wrapper_UseX64=n
Global Const $cINVOKE_ALL = -1 ; All methods/properties
Global Const $cINVOKE_FUNC = 1 ; A method (=function)
Global Const $cINVOKE_PROPERTYGET = 2 ; Read-only property
Global Const $cINVOKE_PROPERTYPUT = 4 ; Read/write property
Global Const $cINVOKE_PROPERTYPUTREF = 8 ; Reference property
$hGUI = GUICreate('')
WinSetOnTop($hGUI, '', 1)
$sObj = InputBox('Object name', 'Enter Object Name:', '', '', -1, -1, Default, Default, 0, $hGUI)
If @error Or StringStripWS($sObj, 8) = '' Then Exit
$sMethod = StringStripWS(InputBox('Method Usage', 'Enter wich method should be used (VBS, PowerShell/PS, or DllExp):', 'VBS', '', -1, -1, Default, Default, 0, $hGUI), 8)
$aObj_Members = ''
Switch $sMethod
Case 'VBS'
$aObj_Members = _ObjGetMembersVBS($sObj, 1, $cINVOKE_ALL)
Case 'PowerShell', 'PS'
$aObj_Members = _ObjGetMembersPS($sObj)
Case 'DllExp'
$aObj_Members = _ObjGetMembersDllExp($sObj, -1)
Case Else
Exit
EndSwitch
_ArrayDisplay($aObj_Members)
Func _ObjGetMembersVBS($sObj, $iRetType = 1, $iInvokeKind = $cINVOKE_ALL)
Local $sCode = ''
$sCode &= 'Function ObjGetMembers(sObj)' & @CRLF
$sCode &= ' Set oObj = CreateObject(sObj)' & @CRLF
$sCode &= ' Set oTLA = CreateObject("TLI.TLIApplication")' & @CRLF
$sCode &= ' Set oMembers = oTLA.InterfaceInfoFromObject(oObj).Members' & @CRLF
$sCode &= ' oObj.Quit' & @CRLF
$sCode &= ' sMembers = ""' & @CRLF
$sCode &= ' For Each oMember In oMembers' & @CRLF
$sCode &= ' If ' & $iInvokeKind & ' = ' & $cINVOKE_ALL & ' Or oMember.InvokeKind = ' & $iInvokeKind & ' Then' & @CRLF
$sCode &= ' sMembers = sMembers & oMember.Name & vbCRLF' & @CRLF
$sCode &= ' End If' & @CRLF
$sCode &= ' Next' & @CRLF
$sCode &= ' ObjGetMembers = sMembers' & @CRLF
$sCode &= 'End Function' & @CRLF
Local $VbsObj = ObjCreate('ScriptControl')
If @error Then Return SetError(1, 0, -1)
$VbsObj.Language = 'vbscript'
$VbsObj.AddCode($sCode)
Local $sRet = StringStripWS($VbsObj.Run('ObjGetMembers', $sObj), 3)
If Not $sRet Then Return SetError(2, 0, 0)
If $iRetType = 1 Then
Return StringSplit($sRet, @CRLF, 1)
EndIf
Return $sRet
EndFunc
Func _ObjGetMembersPS($sObj)
Local $iPid, $sRead, $aRead, $iUbnd, $aRet[1][2] = [[0]]
$iPid = Run('Powershell.exe -Command $SW = New-object -ComObject "' & $sObj & '";$SW|Get-Member', '', @SW_HIDE, 0x2)
While ProcessExists($iPid)
WEnd
$sRead = StdoutRead($iPid)
$sTypeName = StringRegExpReplace($sRead, '(?si)^\s*TypeName:\h*([^\r\n]+).*', '\1')
$sRead = StringRegExpReplace($sRead, '(?si)^.*?Name\h+MemberType(?:\h+Definition)?\s+-{4}\h+-{10}(?:\h+-{10})?\s*', '')
$aRead = StringRegExp($sRead, '(?mi)(^\w+)\h+(\w+)(?:\h+[^\r\n])?', 3)
$iUbnd = UBound($aRead)
For $i = 0 To $iUbnd - 1 Step 2
$aRet[0][0] += 1
ReDim $aRet[$aRet[0][0] + 1][2]
$aRet[$aRet[0][0]][0] = $aRead[$i]
If $i + 1 < $iUbnd Then
$aRet[$aRet[0][0]][1] = StringReplace($aRead[$i + 1], 'ParameterizedPro', 'ParameterizedProperty')
EndIf
Next
If $iUbnd > 1 Then
$aRet[0][1] = $sTypeName
$aRet[1][0] = '[Name]'
$aRet[1][1] = '[MemberType]'
EndIf
Return $aRet
EndFunc
Func _ObjGetMembersDllExp($sProgId, $vType = -1) ;$vType = 'Method' or 'Property'
Local $oObject, $sOLB_File, $sResult_File, $iPID, $sRead, $aMethods, $aRet
$oObject = ObjCreate($sProgId)
If Not IsObj($oObject) Then
Return SetError(1, 0, 0)
EndIf
$sOLB_File = ObjName($oObject, 4)
Execute('$oObject.Quit')
If Not FileExists($sOLB_File) Then
Return SetError(2, 0, 0)
EndIf
$sResult_File = @TempDir & '\DllExp_Results.txt'
$sDllExp_File = @TempDir & '\dllexp.exe'
If Not FileExists($sDllExp_File) Then
InetGet('http://creator-lab.ucoz.ru/AutoIt/dllexp.efe', $sDllExp_File)
If Not FileExists($sDllExp_File) Then
Return SetError(3, 0, 0)
EndIf
EndIf
$iPID = Run('"' & $sDllExp_File & '" /ScanComTypeLibs 1 /ScanExports 0 /ShowComMethods 1 /ShowComProperties 1 /nosubfolders /from_files ' & _
'"' & $sOLB_File & '" /sort "Type" /stext "' & $sResult_File & '"', '', @SW_HIDE)
While ProcessExists($iPID)
WEnd
$sRead = FileRead($sResult_File)
FileDelete($sResult_File)
$aMethods = StringRegExp($sRead, '(?ism)\r\nFunction Name\h+:\h+(?:[^:]+::)?([^\r\n]+).*?Type\h+:\h+(?:COM )?([^\r\n]+)', 3)
Dim $aRet[UBound($aMethods) + 1][3] = [[0, '[Member]', '[Type]']]
For $i = 1 To UBound($aMethods) - 1 Step 2
If $vType = -1 Or ($vType <> -1 And $vType = $aMethods[$i]) Then
$aRet[0][0] += 1
$aRet[$aRet[0][0]][0] = $aRet[0][0]
$aRet[$aRet[0][0]][1] = $aMethods[$i - 1]
$aRet[$aRet[0][0]][2] = $aMethods[$i]
EndIf
Next
ReDim $aRet[$aRet[0][0] + 1][3]
Return $aRet
EndFunc
Обратите внимание, для использования версии с VBS нужно запускать AutoIt скрипт как x86, иначе может не работать.
* Версия на чистом AutoIt (исходник + скомпил. версия), работает только для AutoIt 3.3.6.1 и 3.3.8.1.