Автор Тема: _ObjGetMembers - Получение свойств объекта  (Прочитано 4113 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Пример использования функции получения свойств и методов объекта.
Имеется три метода для получения свойств и методов объекта:

1) _ObjGetMembersVBS - использует VBS скрипт и объект TLI.TLIApplication (в недавних версиях AutoIt он не работает).
2) _ObjGetMembersPS - использует PowerShell скрипт.
3) _ObjGetMembersDllExp - использует утилиту Dll Export Viewer.

Код: AutoIt [Выделить]
#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.
« Последнее редактирование: Февраль 13, 2015, 02:34:39 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

_ObjGetMembers - Получение свойств объекта
« Отправлен: Февраль 10, 2015, 01:49:24 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #1, Отправлен: Февраль 10, 2015, 18:13:53 »
Поправил немного.

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2797
  • Репутация: 472
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #2, Отправлен: Февраль 10, 2015, 23:33:56 »
Win 7 x64 , код запуская как х86. VBS не работает ни с одним объектом, к примеру, офиса 2010
или это не для версии 3.3.12.0 ?
просто не совсем понял
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #3, Отправлен: Февраль 12, 2015, 03:48:44 »
joiner  [?]
Цитировать
Win 7 x64 , код запуская как х86. VBS не работает ни с одним объектом, к примеру, офиса 2010
или это не для версии 3.3.12.0 ?
Это для этой версии в том числе (хотя он от версии особо не зависит).
У меня такая же система, но Office 2007, работает без проблем.

Русское сообщество AutoIt

Re: _ObjGetMembers - Получение свойств объекта
« Ответ #3 Отправлен: Февраль 12, 2015, 03:48:44 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #4, Отправлен: Февраль 12, 2015, 12:29:42 »
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 [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2797
  • Репутация: 472
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #5, Отправлен: Февраль 12, 2015, 13:37:50 »
madmasles  [?]
Цитировать
Последняя версия функций (проверял на HTMLFILE):
у меня показывает свойства этого объекта. параметры системы Win 7 x64
но только при использовании PowerShell
с VBS, как и писал выше, не работает и не выдает ошибок

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #6, Отправлен: Февраль 12, 2015, 13:46:55 »
joiner  [?]
Цитировать
не работает и не выдает ошибок
Ошибки только выдает на 3.3.8.1.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: _ObjGetMembers - Получение свойств объекта
« Ответ #7, Отправлен: Февраль 13, 2015, 02:33:51 »
Обновил немного, добавил метод с Dll Export Viewer, также добавил в шапку версию на чистом AutoIt (только для 3.3.6.1 или 3.3.8.1).

Русское сообщество AutoIt

Re: _ObjGetMembers - Получение свойств объекта
« Ответ #7 Отправлен: Февраль 13, 2015, 02:33:51 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
3618 Просмотров
Последний ответ Июнь 03, 2011, 00:43:04
от dwerf
0 Ответов
1470 Просмотров
Последний ответ Август 05, 2012, 16:18:50
от vladu
11 Ответов
3297 Просмотров
Последний ответ Декабрь 18, 2012, 10:27:29
от Денис
0 Ответов
1647 Просмотров
Последний ответ Октябрь 21, 2013, 13:12:52
от artpluss
5 Ответов
2062 Просмотров
Последний ответ Июль 15, 2015, 11:20:22
от Vovsla
0 Ответов
642 Просмотров
Последний ответ Июль 06, 2015, 22:34:43
от madmasles
5 Ответов
2029 Просмотров
Последний ответ Ноябрь 23, 2015, 11:20:51
от Viton-Zizu
0 Ответов
617 Просмотров
Последний ответ Ноябрь 17, 2015, 15:02:10
от madmasles
3 Ответов
505 Просмотров
Последний ответ Сентябрь 25, 2017, 16:21:43
от Dima1337
2 Ответов
488 Просмотров
Последний ответ Октябрь 25, 2017, 10:44:59
от OlegSmirnov