SAMPLE: DISPINVOKER.EXE How to Implement CallByName in Visual Basic 4.0 and Visual Basic 5.0 (202057)



The information in this article applies to:

  • Microsoft Visual Basic Standard Edition, 32-bit, for Windows 4.0
  • Microsoft Visual Basic Professional Edition, 32-bit, for Windows 4.0
  • Microsoft Visual Basic Enterprise Edition, 32-bit, for Windows 4.0
  • Microsoft Visual Basic Learning Edition for Windows 5.0
  • Microsoft Visual Basic Professional Edition for Windows 5.0
  • Microsoft Visual Basic Enterprise Edition for Windows 5.0

This article was previously published under Q202057

SUMMARY

DispInvoker.exe is a self-extracting executable file that provides functionality similar to the Visual Basic 6.0 CallByName function. Most of the time you can discover the properties and methods of an object at design-time and write code to handle them. In a few cases, however, you may not know about an object's properties and methods in advance, or you may simply want the flexibility of allowing an end user to specify properties or execute methods at run-time. Visual Basic 6.0 introduced the CallByName function to provide this functionality, but it is not available in earlier versions of Visual Basic. The Dispinvoker sample provides similar functionality, allowing you to create a wrapper object with:
  • The same methods and properties of the original object.

  • An additional method, Call(), which allows calling methods and retrieving properties from the original object by means of late binding.

Call() Method

  • Contains the method or property name as the first parameter.
  • Receives the other method parameters as the subsequent parameters.
  • Returns the same value returned by the method or property called.

MORE INFORMATION

The following files are available for download from the Microsoft Download Center:
For additional information about how to download Microsoft Support files, click the following article number to view the article in the Microsoft Knowledge Base:

119591 How to Obtain Microsoft Support Files from Online Services

Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.
File NameFile Size
class11KB
DispTools.aps4KB
DispTools.clw1KB
DispTools.cpp4KB
DispTools.def1KB
DispTools.dll74KB
DispTools.dsp17KB
DispTools.dsw1KB
DispTools.h7KB
DispTools.idl1KB
DispTools.ncb153KB
DispTools.opt55KB
DispTools.plg4KB
DispTools.rc4KB
DispTools.tlb2KB
DispTools_i.c2KB
DispTools_p.c7KB
DispToolsps.def1KB
DispToolsps.mk1KB
dlldata.c1KB
dlldatax.c1KB
form13KB
lUnklmpl.cpp1KB
lUnklmpl.h1KB
lUnklmpl.rgs1KB
module11KB
Mssccprj1KB
Project122KB
Project11KB
resource.h1KB
StdAfx.cpp1KB
StdAfx.h1KB
Wrap.cpp2KB
Wrap.h5KB
Wrap.rgs1KB
Automation allows calling objects in three ways:
  • Vtable Binding: The method is referenced directly; the compiler replaces the method call with an explicit reference to the method code.
  • Early Binding: The method is called by means of an ID (DISPID).
  • Late Binding: The method is called by name, the method ID is retrieved at run-time.
Development tools, such as Visual Basic, allow limited use of late binding. Method names must always be explicitly specified at design-time and cannot be specified at run-time.

Dispinvoker is a C++ Dispatch object that allows full exploitation of late binding.

An Automation Object, obj, and the wrapper object, objWrap, may be obtained as follows:
Set objWrap = Wrap.GetInvoker(obj)
objWrap has the same methods as obj plus the additional method Call(), which allows full use of late binding.

The Call() method in the Dispinvoker wrapper uses the GetIDsOfNames() method to determine the DispID of the method to be called. The call is then issued with the parameters passed from the client.

Here are a few things to keep in mind:
  • The Call method does not support named parameters.

  • The Call method does not allow you to assign values to properties. They may only be read.

  • The Dispinvoker wrapper does not return Type information (GetTypeInfoCount method returns 0, GetTypeInfo method returns E_NOTIMPL)

  • Dispinvoker uses DISPID_EVALUATE for the method call.

Sample Code

Given a Visual Basic client and an automation object named obj, of type Class1, with method mySub(), add the following code:

 ' Create an object of type class1
    Dim obj As New Class1
    Dim wrp as New DISPTOOLSLib.Wrap
    Dim objWrp As Object

 ' Retrieve the DispInvoker wrapper
    Set objWrp = wrp.GetInvoker(obj)

    obj.mySub ' Calls method mySub directly on the object obj.
    objWrp.mySub ' Calls method mySub on the DispInvoker wrapper ObjWrp.
    objWrp.Call("mySub") ' Calls method mySub using Call() method on the 
                         ' DispInvoker wrapper.
'--------------------------------
Running the preceding code does the following:
  • Creates the Automation object.
  • Gets the DispInvoker Wrapper.
  • Shows calling mySub method directly onto the object by means of the Dispinvoker wrapper.

Modification Type:MinorLast Reviewed:8/5/2004
Keywords:kbfile kbhowto kbSample KB202057