Microsoft KB Archive/121218

= FIX: pvarResult Should Be NULL When vtRet==VT_EMPTY =

Article ID: 121218

Article Last Modified on 12/2/2003

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 1.5 Professional Edition

 Microsoft Visual C++ 1.51

 Microsoft Visual C++ 2.0 Professional Edition

 Microsoft Visual C++ 2.0 Professional Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q121218

<div class="symptoms_section">

SYMPTOMS
A call to COleDispatchDriver::InvokeHelper causes the server to generate an error when the return type is VT_EMPTY. The nature of the error depends on the automation server. For example, the Word.Basic automation server causes the following error on some methods that have a return type of void (_DEBUG build):

Assertion Failed Line 315, OLEDISP2.CPP

By using the debugger to examine the excepInfo structure, you'll see that the btrDescription member contains this message:

Non Function called as function.

<div class="cause_section">

CAUSE
The OLE version 2.0 documentation indicates that in a call to IDispatch- >Invoke the pvarResult parameter should be NULL if the caller does not expect a return value. However the MFC implementation always passes a non- NULL pointer to an empty variant structure. In most cases an automation server will simply ignore pvarResult when it doesn't intend to return a value. But some servers will actually perform error checking on this parameter and will generate an error if it is non-NULL.

<div class="resolution_section">

RESOLUTION
To work around this problem, derive your own class from COleDispatchDriver, such as CMyOleDispatchDriver, and create your own InvokeHelperVoid function. Then call your own InvokeHelperVoid function instead of InvokeHelper when you need to call a method that has no return value.

To implement this work around, create two new functions in your COleDispatchDriver derived class: CMyOleDispatchDriver::InvokeHelperVVoid CMyOleDispatchDriver::InvokeHelperVoid Implement these functions by copying the implementations of InvokeHelperV and InvokeHelper from OLEDISP2.CPP.

Then modify the following line in InvokeHelperVoid from: InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,    argList);

to:

InvokeHelperVVoid(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,    argList); Then modify the following lines in InvokeHelperVVoid from: HRESULT hr = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,     &dispparams, &vaResult, &excepInfo, &nArgErr);

to:

HRESULT hr = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,           &dispparams, NULL, &excepInfo, &nArgErr); On some servers, you may also need to re-implement the COleDispatchDriver::SetProperty function and replace it with your own SetPropertyVoid function by copying the implementation from OLEDISP2.CPP. Just as for the InvokeHelper function, you will need to change it to call InvokeHelperVVoid instead of InvokeHelperV.

<div class="status_section">

STATUS
Microsoft has confirmed this to be a bug in the products listed at the beginning of this article. This bug was corrected in Visual C++ 1.52 and Visual C++ 2.1.

Additional query words: 1.50 2.00 2.50 2.51 3.00

Keywords: kbbug kbfix KB121218

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.