2011-02-28 70 views
1

在启用/ EHsc的情况下,Microsoft批准的设置线程名称的方式不会编译。编译器告诉我我可以通过/ EHsc获得“__try”条款吗?

C2712:在要求对象展开

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) 
    { 
    } 
} 

就如何解决这一问题,而不改变编译器设置任何想法功能无法使用__try?

在WinXP

回答

1

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

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

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

+0

它是__try和__except,它在MSDN文档中写错了。我从Qt复制粘贴的代码包含__except。但将它分成两个功能是可行的! – Pieter 2011-02-28 16:09:20

+0

@Pieter:您链接到的MSDN文章包含正确的拼写'__except'。无论如何,很高兴你的工作。 – 2011-02-28 16:12:03

+0

啊哈,你说的对。 2003版的http://msdn.microsoft.com/en-us/library/xcb2z8hs%28vs.71%29.aspx是另一版本的版本。我搞砸了我从哪里复制它。我猜可能有一个原因。 – Pieter 2011-02-28 16:17:58

相关问题