1

我有一个 ActiveX/COM DLL。它包含许多方法和属性。根据以下代码段,我希望能够询问它是否具有特定符号:

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

有没有办法从 VBScript 或 JScript 中做到这一点?如果没有,我应该去哪里获取我需要的信息?

4

3 回答 3

1

在谷歌搜索并没有找到我想要的东西之后,我想起了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 的路径作为第一个参数传入。

于 2009-05-14T02:33:22.777 回答
0

我使用 Microsoft 的交互式 OLE/COM-Object 查看器在 ActiveX-DLL 中查找方法及其参数。也许查看查看器的源代码会引导您朝着正确的方向前进:MSDN OleView 示例

于 2009-05-13T10:22:13.173 回答
0

如果您想以编程方式执行此操作 - 我不知道有一种简单的方法可以做到这一点。无论如何,如果您真的需要(并且如果您的编程语言足够强大) - 您可以查询类型库(请参阅http://msdn.microsoft.com/en-us/library/ms221549.aspx上的 ITypeLib 描述)。

此外,如果您已经有一个 IDispatch 指针 - 您可能会考虑使用它的服务来动态枚举接口支持的方法(请参阅 MSDN 中的 IDispatch 描述)。

于 2009-05-14T00:02:37.077 回答