Comment puis-je rechercher un objet ActiveX / COM pour une méthode?
Question
J'ai une DLL ActiveX / COM. Il contient de nombreuses méthodes et propriétés. Je voudrais être en mesure de lui demander si elle a un symbole particulier, selon l'extrait suivant:
If HasMethod( "StdLib.DLL", "ReadFileE" ) Then
...
End If
Est-il possible de le faire, disons, VBScript ou JScript? Sinon, où dois-je aller pour obtenir l'information nécessaire?
La solution
Après googler autour de pas tout à fait de trouver ce que je voulais, je me suis souvenu Edanmo de site qui me fait penser à TLBINF32.DLL, le téléchargement de Microsoft TLBINF32.CHM et la lecture sur GetMembersWithSubStringEx. Ci-dessous la mise en œuvre de celui-ci (en fait VB6 avec une référence à TLBINF32.DLL), certains VBScript de démonstration et de sortie, et l'emballage de cette fonctionnalité dans certains 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 démo. Le code ci-dessus était inclus dans stdlib DLL dans le coclasse du Registre.
Dim O, R
Set O = CreateObject("Std.Registry")
Set R = CreateObject("Std.Arrays")
WScript.Echo R.ShowStructure( O.SearchTLIMethodsAndProperties( "MSSCRIPT.OCX",""))
La sortie de la démo (script a été exécuté dans 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
Enfin, le code VBA. Une cellule a un symbole et cette routine trouve ou retourne une chaîne d'erreur.
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
Quand j'y repense maintenant, je pense que je pourrais passer le chemin de la DLL / OCX comme premier paramètre.
Autres conseils
Je l'ai utilisé Microsofts OLE visualiseur interactif / COM-Object pour trouver mehods et leurs paramètres dans ActiveX DLL. Peut-être à la recherche du code source du spectateur vous mènera dans la bonne direction: exemple MSDN OleView
Si vous voulez faire programmatiquement - Je ne suis pas au courant d'une façon de le faire simples . Quoi qu'il en soit, si vous avez vraiment besoin (et si votre langage de programmation est assez capable) - vous pouvez interroger la bibliothèque de type (voir la description ITypeLib quelque part à http://msdn.microsoft.com/en-us/library/ms221549.aspx ).
En outre, si vous avez déjà un pointeur IDispatch -. Vous pouvez envisager d'utiliser ses services d'énumérer dynamiquement méthodes prises en charge par l'interface (reportez-vous à la description IDispatch dans MSDN)