Вопрос

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

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

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

Это было полезно?

Решение

Погуглив и не найдя того, что мне нужно, я вспомнил Эданмо сайт, который заставил меня задуматься о 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 в соклассе Registry.

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 в качестве первого параметра.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top