Как найти метод в объекте ActiveX/COM?
Вопрос
У меня есть 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).