Come faccio a cercare un oggetto ActiveX / COM per un metodo?
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?
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)