Domanda

Ho un DLL ActiveX / COM. Esso contiene molti metodi e proprietà. Vorrei essere in grado di chiedere se ha un particolare simbolo, secondo il seguente frammento:

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

C'è un modo per fare questo, diciamo, VBScript o JScript? Se no, dove devo andare per ottenere le informazioni di cui ho bisogno?

È stato utile?

Soluzione

Dopo Googling intorno non del tutto trovando quello che volevo, mi sono ricordato il Edanmo sito che mi ha fatto pensare a TLBINF32.DLL, il download di Microsoft TLBINF32.CHM e leggendo su GetMembersWithSubStringEx. Sotto è l'attuazione di esso (fatto in VB6 con un riferimento a TLBINF32.DLL), alcuni demo VBScript e uscita, e l'avvolgimento di tale funzionalità in qualche 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 demo. Il codice di cui sopra è stata inclusa nel mio stdlib DLL nel coclasse Registro di sistema.

Dim O, R
Set O = CreateObject("Std.Registry")
Set R = CreateObject("Std.Arrays")
WScript.Echo R.ShowStructure( O.SearchTLIMethodsAndProperties( "MSSCRIPT.OCX",""))

Uscita dalla demo (script è stato eseguito in 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

Infine, il codice VBA. Una cellula ha un simbolo in esso e questa routine lo trova o restituisce una stringa di errore.

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

Ripensandoci ora, penso che potrei passare il percorso della DLL / OCX come primo parametro.

Altri suggerimenti

Ho usato Microsofts spettatore OLE interattivo / COM-Object per trovare mehods ei relativi parametri in ActiveX-DLL. Forse guardando il codice sorgente dello spettatore vi condurrà nella giusta direzione: MSDN OleView esempio

Se si vuole fare a livello di codice - Io non sono a conoscenza di un semplice modo per farlo. In ogni caso, se si ha realmente bisogno di (e se il vostro linguaggio di programmazione è in grado sufficiente) - è possibile interrogare la libreria dei tipi (fare riferimento alla descrizione ITypeLib da qualche parte a http://msdn.microsoft.com/en-us/library/ms221549.aspx ).

Inoltre, se si dispone già di un puntatore IDispatch -. Si potrebbe considerare l'utilizzo dei suoi servizi per enumerare dinamicamente metodi supportati dall'interfaccia (fare riferimento alla descrizione IDispatch in MSDN)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top