1

ActiveX/COM DLL があります。多くのメソッドとプロパティが含まれています。次のスニペットのように、特定のシンボルがあるかどうかを尋ねられるようにしたいと思います。

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

たとえば、VBScript や JScript からこれを行う方法はありますか? そうでない場合、必要な情報はどこで入手できますか?

4

3 に答える 3

1

グーグルで探し回っても欲しいものが見つからなかったので、TLBINF32.DLL について考えさせられたEdanmoのサイトを思い出し、Microsoft のTLBINF32.CHMをダウンロードし、GetMembersWithSubStringEx を調べました。以下は、その実装 (TLBINF32.DLL を参照して VB6 で実行)、いくつかのデモ 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 のデモ。上記のコードは、Registry コクラスの 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 に答える