Что нового

Как узнать, обладает ли объект указанным свойством.

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Как проверить, обладает ли объект указанным свойством или методом не используя обработчик com ошибок. Вот что я имею ввиду:
Код:
;Создадим объект
$oShell = ObjCreate("Shell.Application")
If @error Then Exit 99
;Хочу знать, поддерживается ли метод blablabla
If IsMethod($oShell.blablabla) Then
	;Метод поддерживается
Else
	;Метод не поддерживается
EndIf


Конечто, в версии 3.3.9.4 ошибки com уже не приводят к фатальному выкиду. Но все таки, есть ли правильный способ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$oShell = ObjCreate("Shell.Application")
If @error Then Exit 99

$aError = ObjEvent('AutoIt.Error', '_COM_Error_Handler')

$oShell.blablabla
;~ $oShell.windows

If @error Then
	MsgBox(48, 'Title', 'Метод не поддерживается!')
Else
	MsgBox(64, 'Title', 'Метод поддерживается!')
EndIf

Func _COM_Error_Handler()
	SetError(1)
EndFunc
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я спрашивал "не используя обработчик ошибок". Вы не внимательно прочитали. ;)
 

CreatoR

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

Есть ещё вот такой способ, но он требует регистрации регистрирует библиотеку tlbinf32.dll от Visual Studio (скачивается если объект не создан).

Код:
$oObj = ObjCreate('Scripting.FileSystemObject')

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

Func _ObjMemberIsValid($oObj, $vMember)
	Local $aObj_Members = _ObjGetMembers($oObj, 1)
	
	For $i = 1 To UBound($aObj_Members)-1
		If $aObj_Members[$i] = $vMember Then
			Return 1
		EndIf
	Next
	
	Return 0
EndFunc

Func _ObjGetMembers($oObj, $iRetType = 0)
	If Not IsObj($oObj) Then Return SetError(-1, 0, 0)
	
	Local $oTLA = ObjCreate("TLI.TLIApplication")
	
	If Not IsObj($oTLA) Then
		InetGet('http://creator-lab.ucoz.ru/AutoIt/tlbinf32.dll', @TempDir & '\tlbinf32.dll')
		RunWait('regsvr32 /s "' & @TempDir & '\tlbinf32.dll"', '', @SW_HIDE)
		
		$oTLA = ObjCreate("TLI.TLIApplication")
		
		If Not IsObj($oTLA) Then
			Return SetError(1)
		EndIf
	EndIf
	
	Local $objInterface = $oTLA.InterfaceInfoFromObject($oObj)
	Local $oMembers = $objInterface.Members
	Local $sRet_Members = ""
	
	For $iMember In $oMembers
		$sRet_Members &= $iMember.Name & @CRLF
	Next
	
	$sRet_Members = StringStripWS($sRet_Members, 3)
	
	If $iRetType = 1 Then Return StringSplit($sRet_Members, @CRLF, 1)
	Return $sRet_Members
EndFunc
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
О, спасибо интересная штука. Она позволяет же узнать все свойства и методы объекта!
:
Может быть знаете такую програму для просмотра всех свойств и методов?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
К сожалению, ваш способ не работает.
Код:
$oObj = ObjCreate('Shell.Application')
ConsoleWrite("_ObjMemberIsValid($oObj, 'NonExsistingMember'): " & _ObjMemberIsValid($oObj, 'Windows') & @LF)

Windows - метод существует, а скрипт возвращает 0
 

CreatoR

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

Он работает, просто «_ObjGetMembers» возвращает не все методы и свойства для «Shell.Application» :(.
Это уже не ко мне, тут что то с объектом «TLI.TLIApplication».
 
Верх