Что нового

Процессы Как получить список COM-объектов?

Oki

Продвинутый
Сообщения
452
Репутация
62
Как получить список всех COM-объектов? Например, в массив.
Сообщение автоматически объединено:

С практической точки зрения вопрос также подразумевает, какую информацию возможно получить в такой список. Только ссылки и неуникальные имена? Или ещё что-то?
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
Код:
#include <Array.au3>
Local $aCOMObjects=__Win32_ClassicCOMClassSetting()
_ArrayDisplay($aCOMObjects,'COM')

Func __Win32_ClassicCOMClassSetting()
    Local $objWMIService=ObjGet('winmgmts:\\localhost\root\CIMV2'),$colItems=$objWMIService.ExecQuery('SELECT * FROM Win32_ClassicCOMClassSetting','WQL',48)
    If Not IsObj($colItems)Then Return SetError(1,0,'')
    Local $aRet[20000][2],$n=0
    For $objItem In $colItems
; [01]    AppID
; [02]    AutoConvertToClsid
; [03]    AutoTreatAsClsid
; [04]    Caption
; [05]    ComponentId
; [06]    Control
; [07]    DefaultIcon
; [08]    Description
; [09]    InprocHandler
; [10]    InprocHandler32
; [11]    InprocServer
; [12]    InprocServer32
; [13]    Insertable
; [14]    JavaClass
; [15]    LocalServer
; [16]    LocalServer32
; [17]    LongDisplayName
; [18]    ProgID
; [19]    SettingID
; [20]    ShortDisplayName
; [21]    ThreadingModel
; [22]    ToolBoxBitmap32
; [23]    TreatAsClsid
; [24]    TypeLibraryId
; [25]    Version
; [26]    VersionIndependentProgId
        $aRet[$n][0]=String($objItem.ProgID)
        $aRet[$n][1]=String($objItem.Caption)
        $n+=1
    Next
    ReDim $aRet[$n][2]
    Return $aRet
EndFunc
 
Последнее редактирование:
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
62
Спасибо! Если правильно понимаю намёк в комментарии, то вот так будет полная информация сразу с выводом в файл.
Код:
$objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2')
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_ClassicCOMClassSetting', 'WQL', 48)
If Not IsObj($colItems) Then
   MsgBox(4096, "Warning", "Warning: Not an object.")
EndIf
$sFields = "AppID|AutoConvertToClsid|AutoTreatAsClsid|Caption|ComponentId|Control|DefaultIcon|Description|InprocHandler|InprocHandler32|InprocServer|InprocServer32|Insertable|JavaClass|"
$sFields &= "LocalServer|LocalServer32|LongDisplayName|ProgID|SettingID|ShortDisplayName|ThreadingModel|ToolBoxBitmap32|TreatAsClsid|TypeLibraryId|Version|VersionIndependentProgId"
$aFields = StringSplit($sFields, "|")
$hFile = FileOpen(@ScriptDir & "\log_COM-objects.xls", 2)
FileWriteLine($hFile, StringReplace($sFields, "|", @TAB))
For $objItem In $colItems
   $sRes = ""
   For $iColumn = 1 To $aFields[0]
      $sRes &= Execute("$objItem." & $aFields[$iColumn])
      If $iColumn < $aFields[0] Then
         $sRes &= @TAB
      EndIf
   Next
   FileWriteLine($hFile, $sRes)
Next
FileClose($hFile)
MsgBox(4096, "", "Script terminated.")
 
  • Like
Реакции: Norm

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
намёк в комментарии
Имена свойств можно получить так:
Код:
#include <Array.au3>
$aNameCOMClass=__Win32_GetNameCOMClass('Win32_ClassicCOMClassSetting')
_ArrayDisplay($aNameCOMClass,'Name')

Func __Win32_GetNameCOMClass($sClass)
  Local $objWMIService=ObjGet('winmgmts:\\localhost\root\CIMV2'),$objItem=$objWMIService.Get($sClass),$sLine
  If Not IsObj($objItem)Then Return SetError(1,0,'')
  For $Item in $objItem.Properties_()
    $sLine&=$Item.Name&'|'
  Next
  Return StringSplit(StringTrimRight($sLine,1),'|')
EndFunc
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
62
Пожалуй, этот последний скрипт достаточно было запустить только один раз, дальше удобнее сразу в константу результаты загонять. Но для полноты картины он необходим, спасибо.
 
Верх