我正在使用以下代码(来自MSDN)重命名C ++线程:
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;
#pragma pack(push,8)
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;
#pragma pack(pop)
void SetThreadName( DWORD dwThreadID, char* threadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
总体而言,这项工作非常有效。但是,当尝试在Visual Studio(2010)扩展包中执行此代码时,我得到以下无法处理的异常,并且该线程的名称不会更改:
发生了System.Runtime.InteropServices.SEHException 消息:外部组件抛出了异常。
任何人都知道那里发生了什么?我意识到从扩展程序更改线程可能存在一些问题,但是,它没有文档记录,并且它似乎在标准加载项中正常工作。
谢谢!
答案 0 :(得分:2)
我不确定这是否是导致问题的原因,但根据this MSDN文档,SetThreadName
函数仅适用于本机代码。从异常情况来看,你看到你正在使用/clr
选项进行编译,所以你应该使用与此相当的托管代码。按照第一个链接中另请参阅部分下的链接,它会显示用于托管代码的代码段。
HTH, 与Ashish。
答案 1 :(得分:1)
听起来很熟悉。以下是SetThreadName
的内部结构(在混合本机C ++,C ++ / CLI,C#应用程序中):
#pragma warning(disable: 6312 6322)
__try
{
RaiseException( 0x406D1388, 0, sizeof(info) / sizeof(DWORD), (DWORD*)&info );
}
// don't implement MSDN's suggested fix for 6312 here - it causes a nasty unhandled exception
// to bubble up into managed code. Disable the compiler warning instead.
__except(EXCEPTION_CONTINUE_EXECUTION)
{
}
#pragma warning(default: 6312 6322)