Как мне найти ActiveX / COM-объект для метода? - PullRequest
1 голос
/ 13 мая 2009

У меня есть ActiveX / COM DLL. Он содержит много методов и свойств. Я хотел бы иметь возможность спросить его, имеет ли он определенный символ, согласно следующему фрагменту:

If HasMethod( "StdLib.DLL", "ReadFileE" ) Then
    ...
End If

Есть ли способ сделать это, скажем, из VBScript или JScript? Если нет, куда мне обратиться за необходимой информацией?

Ответы [ 3 ]

1 голос
/ 14 мая 2009

После того, как я не нашел что-то, что мне нужно, я вспомнил сайт Edanmo , который заставил меня задуматься о TLBINF32.DLL, скачать Microsoft TLBINF32.CHM и прочитать о GetMembersWithSubStringEx. Ниже приведена его реализация (сделано в VB6 со ссылкой на TLBINF32.DLL), демонстрационный VBScript и вывод, а также обертывание этой функциональности в некоторых VBA.

Public Function SearchTLIMethodsAndProperties(sTypelib As Variant, sSymbol As Variant) As Variant
    Dim SI As SearchItem
    Dim aResults As Variant
    Dim bFound as boolean
    Dim Groups(1) As InvokeKinds
    Groups(0) = INVOKE_FUNC Or INVOKE_PROPERTYGET Or _
        INVOKE_PROPERTYPUT Or INVOKE_PROPERTYPUTREF

    ReDim aResults(0)
    bFound = False
    With TypeLibInfoFromFile(sTypelib)
    .SearchDefault = tliStClasses Or tliStEvents
    For Each SI In .GetMembersWithSubStringEx(sSymbol, Groups)
        bFound = True
        arr.AAdd_PostIncrement aResults, SI.Name
    Next
    End With
    if bFound then 
    ReDim Preserve aResults(UBound(aResults) - 1)
    end if
    SearchTLIMethodsAndProperties = aResults
End Function

Демонстрация VBScript. Приведенный выше код был включен в мою библиотеку StdLib в реестре coclass.

Dim O, R
Set O = CreateObject("Std.Registry")
Set R = CreateObject("Std.Arrays")
WScript.Echo R.ShowStructure( O.SearchTLIMethodsAndProperties( "MSSCRIPT.OCX",""))

Вывод из демоверсии (скрипт был запущен в SciTE).

>cscript "C:\foo\foo.vbs"
{Add,AddCode,AddObject,AllowUI,Clear,CodeObject,Column,Count,Description,Error,Eval,ExecuteStatement,HasReturnValue,HelpContext,HelpFile,Item,Language,Line,Modules,Name,NumArgs,Number,Procedures,Reset,Run,SitehWnd,Source,State,Text,Timeout,UseSafeSubset}
>Exit code: 0

Наконец, код VBA. В ячейке есть символ, и эта процедура находит его или возвращает строку ошибки.

Public Function LookupSymbol(sSym As String) As String
    Dim aRes As Variant
    aRes = reg.SearchTLIMethodsAndProperties("MSSCRIPT.OCX", sSym)
    Dim i As Integer
    LookupSymbol = "!!NotFound!!"
    For i = 0 To UBound(aRes)
    If LCase$(aRes(i)) = LCase$(sSym) Then
        LookupSymbol = sSym
        Exit For
    End If
    Next
End Function

Оглядываясь назад сейчас, я думаю, что мог бы передать путь к DLL / OCX в качестве первого параметра.

0 голосов
/ 14 мая 2009

Если вы хотите сделать это программно - я не знаю простого способа сделать это. В любом случае, если вам действительно нужно (и если ваш язык программирования достаточно способен) - вы можете запросить библиотеку типов (см. Описание ITypeLib где-нибудь по адресу http://msdn.microsoft.com/en-us/library/ms221549.aspx).

Кроме того, если у вас уже есть указатель IDispatch - вы можете рассмотреть возможность использования его служб для динамического перечисления методов, поддерживаемых интерфейсом (см. Описание IDispatch в MSDN).

0 голосов
/ 13 мая 2009

Я использовал интерактивный просмотрщик OLE / COM-объектов от Microsoft, чтобы найти методы и их параметры в ActiveX-DLL. Возможно, просмотр исходного кода программы просмотра приведет вас в правильном направлении: Пример MSDN OleView

...