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.
Back to the top
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);
}
Back to the top
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.
Back to the top