Что нового

_ObjGetMembers - Получение свойств объекта

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пример использования функции получения свойств и методов объекта.
Имеется три метода для получения свойств и методов объекта:

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.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Поправил немного.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Win 7 x64 , код запуская как х86. VBS не работает ни с одним объектом, к примеру, офиса 2010
или это не для версии 3.3.12.0 ?
просто не совсем понял
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
joiner [?]
Win 7 x64 , код запуская как х86. VBS не работает ни с одним объектом, к примеру, офиса 2010
или это не для версии 3.3.12.0 ?
Это для этой версии в том числе (хотя он от версии особо не зависит).
У меня такая же система, но Office 2007, работает без проблем.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
Последняя версия функций (проверял на HTMLFILE):
VBS - вываливается с ошибкой
Код:
C:\Users\...\Desktop\AutoIt v3 Script (9).au3 (55) : ==> The requested action with this object has failed.:
Local $sRet = StringStripWS($VbsObj.Run('ObjGetMembers', $sObj), 3)
Local $sRet = StringStripWS($VbsObj.Run('ObjGetMembers', $sObj)^ ERROR
->12:22:12 AutoIt3.exe ended.rc:1
PowerShell -
Код:
Row|Col 0|Col 1
[0]|151|System.__ComObject#{3050f55f-98b5-11cf-bb82-00aa00bdce0b}
[1]|[Name]|[MemberType]
[2]|attachEvent|Method
[3]|clear|Method
[4]|cloneNode|Method
[5]|close|Method
...
Win7 x32.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
madmasles [?]
Последняя версия функций (проверял на HTMLFILE):
у меня показывает свойства этого объекта. параметры системы Win 7 x64
но только при использовании PowerShell
с VBS, как и писал выше, не работает и не выдает ошибок
 
Верх