An access violation occurs when you try to call one of the string conversion macros in Visual C++ (198009)



The information in this article applies to:

  • The Microsoft Active Template Library (ATL) 3.0, when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • The Microsoft Active Template Library (ATL) 2.1, when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0

This article was previously published under Q198009

SYMPTOMS

Calling one of the string conversion macros, such as OLE2T or T2OLE, inside a catch block of a try/catch exception handler causes an access violation.

CAUSE

Some of the string conversion macros will call _alloca(). However, _alloca() cannot be used inside an exception handler.

RESOLUTION

Use MultiByteToWideChar() or WideCharToMultiByte() rather than string conversion macros inside an exception handler.

STATUS

This behavior is by design.

MORE INFORMATION

Exception Handler (EH) routines that run on x86-class processors operate in their own memory "frame:" that is, they perform their tasks in memory space that is not based on the current location of the stack pointer of the enclosing function. Therefore, explicitly calling _alloca in any of the following scenarios results in program failure during the return to the calling EH routine:

  • Windows NT SEH exception filter expression: __except ( alloca() )
  • Windows NT SEH final exception handler: __finally { alloca() }
  • C++ EH catch clause expression

Steps to Reproduce Behavior

   try
   {
      throw (1);
   }
   catch (...)
   {
      USES_CONVERSION;
      LPTSTR str = OLE2T(L"Some String");
   }
				

REFERENCES

Visual C++ Online Documentation for _alloca()

(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Samson Tanrena, Microsoft Corporation.

Modification Type:MajorLast Reviewed:6/2/2005
Keywords:kbtshoot kbExceptHandling kbprb KB198009 kbAudDeveloper