我有一个 ActiveX/COM DLL。它包含许多方法和属性。根据以下代码段,我希望能够询问它是否具有特定符号:
If HasMethod( "StdLib.DLL", "ReadFileE" ) Then
...
End If
有没有办法从 VBScript 或 JScript 中做到这一点?如果没有,我应该去哪里获取我需要的信息?
在谷歌搜索并没有找到我想要的东西之后,我想起了Edanmo网站,它让我想到了 TLBINF32.DLL,下载了微软的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 演示。上面的代码包含在我的注册表 coclass 中的 StdLib DLL 中。
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 的路径作为第一个参数传入。
我使用 Microsoft 的交互式 OLE/COM-Object 查看器在 ActiveX-DLL 中查找方法及其参数。也许查看查看器的源代码会引导您朝着正确的方向前进:MSDN OleView 示例
如果您想以编程方式执行此操作 - 我不知道有一种简单的方法可以做到这一点。无论如何,如果您真的需要(并且如果您的编程语言足够强大) - 您可以查询类型库(请参阅http://msdn.microsoft.com/en-us/library/ms221549.aspx上的 ITypeLib 描述)。
此外,如果您已经有一个 IDispatch 指针 - 您可能会考虑使用它的服务来动态枚举接口支持的方法(请参阅 MSDN 中的 IDispatch 描述)。