views:

204

answers:

3

I have an ActiveX/COM DLL. It contains many methods and properties. I would like to be able to ask it if it has a particular symbol, as per the following snippet:

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

Is there a way to do this from, say, VBScript or JScript? If not, where do I go to get the information I need?

A: 

I have used Microsofts interactive OLE/COM-Object viewer to find mehods and their parameters in ActiveX-DLLs. Maybe looking at the source code of the viewer will lead you in the right direction: MSDN OleView sample

Stephan Keller
A: 

If you want to do it programmatically - I'm not aware of a simple way to do that. Anyway, if you really need to (and if your programming language is capable enough) - you can query the type library (refer to ITypeLib description somewhere at http://msdn.microsoft.com/en-us/library/ms221549.aspx).

Also, if you already have an IDispatch pointer - you might consider using its services to dynamically enumerate methods supported by the interface (refer to IDispatch description in MSDN).

Andrey
+1  A: 

After Googling around not quite finding what I wanted, I remembered the Edanmo site which got me thinking about TLBINF32.DLL, downloading Microsoft's TLBINF32.CHM and reading up on GetMembersWithSubStringEx. Below is the implementation of it (done in VB6 with a reference to TLBINF32.DLL), some demo VBScript and output, and the wrapping of that functionality in some 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. The above code was included in my StdLib DLL in the Registry coclass.

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

Output from the demo (script was run 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

Finally, the VBA code. A cell has a symbol in it and this routine finds it or returns an error string.

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

Looking back on it now, I think I might pass in the path to the DLL/OCX as the first parameter.

boost