Re: VC8, Adding __event to non-CLR code gives error C2712
Marcus Heege wrote:
Hi Edwad,
"Edward Diener" <eddielee_no_spam_here@tropicsoft.com> wrote in message
news:%23ZiWiRabGHA.3632@TK2MSFTNGP05.phx.gbl...
In a non-CLR class I have a number of __events defined. When compiling
the source code in which the corresponding header file has these __events,
I receive the error:
error C2712: Cannot use __try in functions that require object unwinding
pointing to the last of the __event lines in my header file.
When I look at the error message it says:
"cannot use __try in functions that require object unwinding".
Further it is mentioned that "object unwinding" means "destruction".
Needless to say I am not using __try anywhere but perhaps the code being
generated by the __event extended keyword is. I have no idea what the
function that "requires object unwinding" is. How do I resolve this issue
? This problem did not occur for the same code under VC7.1, and frankly I
do not understand why the generated __try keyword can not work with
objects which have destructors.
Re your problem: Can you please post some VC8 code that reproduces the error
and some VC7.1 code that works?
Here is the header file:
===================================================================================
// RegularExpression.h: interface for the RegularExpression class.
//
//////////////////////////////////////////////////////////////////////
#if
!defined(AFX_REGULAREXPRESSION_H__D4133B40_BB9D_11D3_BD0C_000000000000__INCLUDED_)
#define
AFX_REGULAREXPRESSION_H__D4133B40_BB9D_11D3_BD0C_000000000000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afx.h>
#include <vector>
#if defined(BUILD_REGULAR_EXPRESSION)
#define REGULAR_EXPRESSION_IMPORT_EXPORT __declspec(dllexport)
#else
#define REGULAR_EXPRESSION_IMPORT_EXPORT __declspec(dllimport)
#endif
#pragma pack(push,8)
struct REMatch { CString string; unsigned position; };
typedef std::vector<REMatch> REMatchInfo;
class REGULAR_EXPRESSION_IMPORT_EXPORT RegularExpression : public CObject
{
public:
/* 1) */ __event void OnSearching(RegularExpression *,const REMatchInfo
&,unsigned,unsigned);
/* 2) */ __event void OnChangingFiles(RegularExpression *,CString,const
REMatchInfo &,unsigned,bool &);
RegularExpression();
virtual ~RegularExpression();
// Overridables
virtual void Serialize(CArchive &);
#if defined(_DEBUG)
// Diagnostic Support
virtual void AssertValid() const;
virtual void Dump(CDumpContext &) const;
#endif
private:
DECLARE_SERIAL(RegularExpression)
};
#pragma pack(pop)
#endif //
!defined(AFX_REGULAREXPRESSION_H__D4133B40_BB9D_11D3_BD0C_000000000000__INCLUDED_)
==================================================================================
Here is the source file:
==================================================================================
// RegularExpression.cpp: implementation of the RegularExpression class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RegularExpression.h"
IMPLEMENT_SERIAL(RegularExpression, CObject, VERSIONABLE_SCHEMA|2)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
RegularExpression::RegularExpression()
{
}
RegularExpression::~RegularExpression()
{
}
// Overridables
void RegularExpression::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
}
#if defined(_DEBUG)
// Diagnostic Support
void RegularExpression::AssertValid() const
{
CObject::AssertValid();
}
void RegularExpression::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
}
#endif
===============================================================================
Here are the compiler options in VC7.1 ( VS2003 .NET )
===============================================================================
/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXEXT" /D
"BUILD_REGULAR_EXPRESSION" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /Gm
/EHsc /RTC1 /MDd /Yu"stdafx.h"
/Fp"Debug/RegularExpressionComponentDllVc71d.pch" /Fo"Debug/"
/Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
===============================================================================
Here are the compiler options in VC8 ( VS2005 )
===============================================================================
/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXEXT" /D
"BUILD_REGULAR_EXPRESSION" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /Gm
/EHsc /RTC1 /MDd /Yu"stdafx.h"
/Fp"Debug\RegularExpressionComponentDllVc8d.pch" /Fo"Debug\\"
/Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt
===============================================================================
In both VC7.1 and VC8 I create an MFC DLL as an MFC extension DLL.
In VC7.1 the source file will compile without error.
In VC8 I get the error C2712: Cannot use __try in functions that require
object unwinding. It points to the line marked as /* 2) */ in the header
file above. If I eliminate that line, the first __event line, marked as
/* 1) */ does not give an error. I suspect it is because CString must be
deleted in the generated __try block. However this error does not
occur in VC7.1 . If I change the CString parameter to const CString &
the error goes away. However I am loath to do this for my events because
I will be breaking, even ever so slightly, backward compatibility for my
library.