Microsoft KB Archive/140590

= FIX: Error in COleDispatchException Constructor =

Article ID: 140590

Article Last Modified on 11/21/2006

-

APPLIES TO

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

 Microsoft Visual C++ 1.51

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

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

 Microsoft Visual C++ 2.1</li></ul>

 Microsoft Visual C++ 2.2</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q140590

<div class="symptoms_section">

SYMPTOMS
In an MFC application, AfxThrowOleDispatchException is used to throw an exception from within an OLE Automation function. When Microsoft Visual Basic is used as the automation client application, it will not be able to correctly interpret the error code passed to AfxThrowOleDispatchException.

<div class="cause_section">

CAUSE
AfxThrowOleDispatchException constructs and throws a COleDispatchException object, which is used to handle exceptions specific to the OLE IDispatch interface. The constructor of COleDispatchException incorrectly initializes the COleDispatchException object, resulting in the Visual Basic client being unable to interpret the error code of the exception.

<div class="resolution_section">

RESOLUTION
To implement the proper behavior for throwing an OLE dispatch exception from an MFC server, do not use AfxThrowOleDispatchException. Instead, construct your own COleDispatchException, set m_scError = 0, and throw the exception yourself as illustrated in the sample code in this article.

<div class="status_section">

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

<div class="moreinformation_section">

MORE INFORMATION
COleDispatchException has two public members (m_wCode and m_scError) which are mapped by COleDispatchException::Process to the wCode and scode members of an EXCEPINFO structure. An EXCEPTINFO structure is used by an automation object to describe an exception that occurred during IDispatch::Invoke. When an automation object raises an exception, it should store an error code inside either wCode or scode but not both. If an error code is passed to the constructor of the COleDispatchException object, the values of both wCode and scode in the EXCEPINFO structure will be set.

Sample Code
// Insert the following code instead of AfxThrowOleDispatchException COleDispatchException* pException; pException = new COleDispatchException(                _T("Some Exception"), 200, 425); pException->m_scError = 0; THROW(pException);

<div class="references_section">