我可以获得一个“__try” - 使用/ EHsc编译的条款吗?

时间:2011-02-28 16:00:57

标签: c++ visual-studio

Microsoft批准的设置线程名称的方法无法在启用/ EHsc的情况下编译。编译器告诉我

C2712:无法在需要对象展开的函数中使用__try

http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx

//
// Usage: SetThreadName (-1, "MainThread");
//
typedef struct tagTHREADNAME_INFO
{
   DWORD dwType; // must be 0x1000
   LPCSTR szName; // pointer to name (in user addr space)
   DWORD dwThreadID; // thread ID (-1=caller thread)
   DWORD dwFlags; // reserved for future use, must be zero
} THREADNAME_INFO;

void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName)
{
   THREADNAME_INFO info;
   info.dwType = 0x1000;
   info.szName = szThreadName;
   info.dwThreadID = dwThreadID;
   info.dwFlags = 0;

   __try
   {
      RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
   }
   __except(EXCEPTION_CONTINUE_EXECUTION)
   {
   }
}

如何在不更改编译器设置的情况下解决此问题?

在WinXP上使用Visual Studio 2008

1 个答案:

答案 0 :(得分:1)

通常的解决方案是将它分成两个函数,一个调用另一个函数。一个设置SEH __try/__except块,另一个设置所有与C ++异常和本地变量的析构函数调用相关的东西。

但是我没有看到任何需要析构函数调用的类型。

也许这只是一个错字(except)vs(__except)?