Help and Support

PRB: How to Use Automation Error Code & Help from Visual Basic

Article ID:122488
Last Review:December 8, 2003
Revision:3.0
This article was previously published under Q122488
On This Page

SYMPTOMS

Visual Basic version 3.0 does not report automation errors that result from OLE automation exceptions. Instead, it reports an err value of 440 and a description string of "OLE Automation exception." The actual wCode passed by the automation server is lost.

Back to the top

STATUS

This behavior is by design in Visual Basic version 3.0. Visual Basic for Applications, included in Excel version 5.0, Visual Basic 4.x and later, and other Microsoft products, returns the wCode correctly.

Back to the top

MORE INFORMATION

When an MFC automation server throws an OLE dispatch exception by calling AfxThrowOleDispatchException, an object of class COleDispatchException is built. Its member variables include an OLE SCODE, a help context, string error description, and wCode (an integer code used by Visual Basic).

The only information that the Visual Basic automation controller preserves is the string description. However, the MFC OLE automation server can preserve the information used in the call to AfxThrowOleDispatchException() and expose an additional "Help" method that uses this information to provide help to the user. From within the Visual Basic error handling code, Err is 440, Error(Err) is "OLE Dispatch Exception" and Error$ is the actual string passed by the server.

Back to the top

Sample Code Snippets

/* Compile options needed:
   standard MFC OLE project generated by AppWizard*/ 
				
1.The method in the Automation server that throws the dispatch exception should retain the help context and wCode as member variable of the automation object as in this function:
   void CMyObject::Exception()
   {
      m_nIDContext = <some context>;
      m_nSomeCode = <some code>;
      AfxThrowOleDispatchException(m_nSomeCode,"String",m_nIDContext);
   }
						
2.The Automation server should expose a method that uses those member variables to start WinHelp or another help engine with the actual context from the exception as in this code:
   short CMyObject::GetError()
   {
      // From here you can use the member variable code
      // and context to start WinHelp or do whatever
      // help code you need to do ...
      AfxGetApp()->WinHelp(m_nIDContext);
      return m_nSomeCode;
   }
						
3.The Visual Basic error handling routine should call the exposed error method in the Automation server when a dispatch exception occurs. Here is example Visual Basic code:
   Sub Command1_Click ()
      On Error GoTo EHandle
      Dim a As object
      Set a = CreateObject("TestAuto")
      ' Next line causes exception:
      a.exception
   EHandle:
      Msg = "The error message for error number "
      Msg = Msg & Err & " is:" & NL & NL
      Msg = Msg & """" & Error(Err) & """"
      MsgBox Msg  ' Display message.
      ' Next line starts WinHelp engine by calling method in server.
      a.GetError
      Exit Sub
   End Sub

Back to the top


APPLIES TO
Microsoft Visual Basic 3.0 Professional Edition
Microsoft Foundation Class Library 4.2, when used with:
  Microsoft Visual C++ 1.0 Professional Edition
  Microsoft Visual C++ 1.5 Professional Edition
  Microsoft Visual C++ 2.0 Professional Edition

Back to the top

Keywords: 
kbtshoot kbinterop kbautomation kbprb KB122488

Back to the top

Article Translations

 

Other Support Options

  • Contact Microsoft
    Phone Numbers, Support Options and Pricing, Online Help, and more.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.