FIX: ClassWizard Incorrectly Reads LPDISPATCH Params from .TLB (131044)



The information in this article applies to:

  • The ClassWizard, when used with:
    • Microsoft Visual C++ for Windows, 16-bit edition 1.5
    • Microsoft Visual C++ for Windows, 16-bit edition 1.51
    • Microsoft Visual C++ for Windows, 16-bit edition 1.52
    • Microsoft Visual C++, 32-bit Editions 2.0
    • Microsoft Visual C++, 32-bit Editions 2.1
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1
    • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
    • Microsoft Visual C++, 32-bit Professional Edition 4.2

This article was previously published under Q131044

SYMPTOMS

ClassWizard generates improper COleDispatchDriver derived member functions for methods that contain one or more LPDISPATCH* parameters. Specifically, ClassWizard generates member functions using a LPDISPATCH parameter instead of LPDISPATCH*. In other words, the asterisk (*) is missing.

RESOLUTION

To correct this problem, you must edit the COleDispatchDriver derived member directly.

For example, assume there is a type library (.TLB file) for an object that supports a method that returns a void and accepts an LPDISPATCH* as its only parameter. When ClassWizard reads the .TLB file, it generates a new class from COleDispatchDriver. The method for the member function that returns a void and accepts an LPDISPATCH* parameter ends up with this incorrect definition:
   void ITestObject::TestMethod(LPDISPATCH lpDispPtr)
   {
      static BYTE BASED_CODE parms[] =
         VTS_DISPATCH;
      InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
         lpDispPtr);
   }
				
To correct this problem, change the parameter type to LPDISPATCH*, and modify the parms[] array so that it contains a corresponding VTS_PDISPATCH entry instead of VTS_DISPATCH, as illustrated here:
   void ITestObject::TestMethod(LPDISPATCH* lpDispPtr)
   {
      static BYTE BASED_CODE parms[] =
         VTS_PDISPATCH;
      InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
         lpDispPtr);
   }
					

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This was fixed in Visual C++ version 5.0.

Modification Type:MajorLast Reviewed:12/1/2003
Keywords:kbAutomation kbBug kbfix kbVC500fix kbwizard KB131044