Что нового

Получить свойства объекта

eas0371

Новичок
Сообщения
5
Репутация
0
Как в autoit вывести все свойства объекта?
К примеру есть объект:
$oExcel = _ExcelBookNew(0)
К конкретному свойству можно обратиться указывая его через точку:
$oExcel.Range('A2:A5').Select

А как вывести список всех свойств которые можно указать через точку в данном объекте, ведь должно же быть что-то наподобие PropertyList ??
 
Автор
E

eas0371

Новичок
Сообщения
5
Репутация
0
цикл не прокатывает, с помощью него можно перебрать все подобъекты, а если свойство не является объектом?
например, имеем класс:
$objClass = ObjGet("WinMgmts:Win32_DiskDrive")
получаем коллекцию объектов
$colSoftware = $objClass.Instances_
и перебираем все диски установленные на компе
For $objSoftware in $colSoftware
$strResult = $strResult & ' ' & $objSoftware.caption
next
В свойстве Caption содержится название диска.
Но у данного объекта помимо Caption еще много других свойств, тоже строковых - как получить их названия?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вообще списка свойств и методов не существует в объекте, если разработчик заранее не позаботился об этом, чаще всего узнать какие методы и свойства есть у данного объекта можно через тот же Google просто задав правильный запрос, например WinMgmts Methods, результат *click*
 
Автор
E

eas0371

Новичок
Сообщения
5
Репутация
0
ну а хотя бы как-то обработать ошибку можно в случае если данного свойства у объекта нет?
например тот же wmi отличается по набору свойств в разных виндах
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
eas0371 [?]
ну а хотя бы как-то обработать ошибку можно в случае если данного свойства у объекта нет? например тот же wmi отличается по набору свойств в разных виндах

В таком случае в скрипте сделать условие

Код:
Switch @OSVersion
	Case 'WIN_8'
		$oObj.Method_1(...)
	Case 'WIN_7'
		$oObj.Method_2(...)
	Case 'WIN_XP'
		$oObj.Method_3(...)
	Case Else
		$oObj.Method_0(...)
EndSwitch
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
eas0371,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

SyDr

Сидра
Сообщения
651
Репутация
158
eas0371
Почитайте в справке:
http://autoit-script.ru/autoit3_docs/intro/ComRef.htm
http://autoit-script.ru/autoit3_docs/functions/ObjEvent.htm

См.
Код:
ObjEvent("AutoIt.Error", "...")
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#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

$sObj = InputBox('_ObjGetMembers', 'Enter object name:', 'Scripting.FileSystemObject')
If StringStripWS($sObj, 8) == '' Then Exit

$oObj = ObjCreate($sObj)
$aObj_Members = _ObjGetMembers($sObj, 1, $cINVOKE_ALL)

If IsArray($aObj_Members) Then
	_ArrayDisplay($aObj_Members)
	
	If UBound($aObj_Members) > 16 Then
		;16 should be .GetTempName
		ConsoleWrite('$oObj.' & $aObj_Members[16] & ' = ' & Execute("$oObj." & $aObj_Members[16]) & @CRLF)
	EndIf
EndIf

ConsoleWrite("_ObjMemberIsValid($sObj, 'NonExsistingMember'): " & _ObjMemberIsValid($sObj, 'NonExsistingMember') & @LF)

Func _ObjGetMembers($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 &= '	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 _ObjMemberIsValid($sObj, $vMember)
	Local $aObj_Members = _ObjGetMembers($sObj)
	
	For $i = 1 To UBound($aObj_Members)-1
		If $aObj_Members[$i] = $vMember Then
			Return 1
		EndIf
	Next
	
	Return 0
EndFunc


Неизвестно почему, но работает только через запуск vbs кода, на AutoIt почему то не создаётся объект TLI.TLIApplication.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs [?]
Супер, вот что наваял из этого:

Код:
#include <Array.au3>

$aMembers = _ObjGetMembersPS('Shell.Explorer.2')
_ArrayDisplay($aMembers)

Func _ObjGetMembersPS($sObj)
    Local $iPid, $sRead, $aRead, $iUbnd, $aRet[1][3] = [[0]]
    
    $iPid = Run('powershell.exe -Command $SW = New-object -ComObject "' & $sObj & '";$SW|Get-Member', "", @SW_HIDE, 0x2 + 0x4)
    ProcessWaitClose("powershell.exe")
   
    $sRead = StdoutRead($iPid)
    $aRead = StringRegExp($sRead, '(?smi)\G(?:\s*(\w+)\h+(\w+)\h+([^\r\n]+))\R*|.*?\s*(.*?)\s*Name\h+MemberType\h+Definition\s*[-\h]+\R*\K', 3)
    $iUbnd = UBound($aRead)
    
    For $i = 1 To $iUbnd - 1 Step 3
        $aRet[0][0] += 1
        ReDim $aRet[$aRet[0][0] + 1][3]
        
        $aRet[$aRet[0][0]][0] = $aRead[$i]
        
        If $i + 1 < $iUbnd Then
            $aRet[$aRet[0][0]][1] = $aRead[$i + 1]
        EndIf
        
        If $i + 2 < $iUbnd Then
            $aRet[$aRet[0][0]][2] = $aRead[$i + 2]
        EndIf
    Next
    
	If $iUbnd > 2 Then
		$aRet[0][1] = $aRead[3]
		$aRet[1][0] = 'Name'
		$aRet[1][1] = 'MemberType'
		$aRet[1][2] = 'Definition'
	EndIf
	
    Return $aRet
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
Ну очень полезная функция получилась, однозначно в полезняшки.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
InnI [?]
Для объектов Excel.Application и Word.Application массив пустой
Там надо регулярку править, текст выдается, добавьте
Код:
ConsoleWrite($sRead & @LF)
 

CreatoR

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Для excel.application, access.application, powerpoint.application работает, а для word.application - нет.
У меня работает.
Что выдаёт StdoutRead($iPid)?
 
Верх