C++ 重命名一个C++;在Visual Studio 2010扩展包下运行时的线程

C++ 重命名一个C++;在Visual Studio 2010扩展包下运行时的线程,c++,visual-studio,visual-studio-2010,C++,Visual Studio,Visual Studio 2010,我使用下面的代码(从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). DW

我使用下面的代码(从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)
   {
   }
}
#包括
常量DWORD MS_VC_异常=0x406D1388;
#pragma包(推送,8)
typedef结构标记线程名称\u信息
{
DWORD dwType;//必须是0x1000。
LPCSTR szName;//指向名称的指针(在用户地址空间中)。
DWORD dwThreadID;//线程ID(-1=调用线程)。
DWORD dwFlags;//保留供将来使用,必须为零。
}THREADNAME_信息;
#布拉格语包(流行语)
void SetThreadName(DWORD dwThreadID,字符*threadName)
{
线程名称\u信息;
info.dwType=0x1000;
info.szName=threadName;
info.dwThreadID=dwThreadID;
info.dwFlags=0;
__试一试
{
RaiseException(MS_VC_异常,0,sizeof(信息)/sizeof(ULONG_PTR),(ULONG_PTR*)和信息);
}
__EXCEPTION(异常\u执行\u处理程序)
{
}
}
总体来说,它工作得很好。但是,当尝试在Visual Studio(2010)扩展包中执行此代码时,我得到了以下未经处理的异常,并且线程的名称没有更改:

System.Runtime.InteropServices.SEHException发生 消息:外部组件引发异常。

有人知道那里发生了什么吗?我意识到从扩展中这样更改线程可能会有一些问题,但是,它没有文档记录,而且从标准外接程序看来工作正常


谢谢

我不确定这是否是问题的原因,但根据MSDN文档,
SetThreadName
函数仅适用于本机代码。根据您看到的异常情况判断,您正在使用
/clr
选项进行编译,因此您可能应该使用与此等效的托管代码。按照第一个链接中“请参见”部分下的链接,它显示了用于托管代码的代码段

嗯,,
Ashish。

听起来很熟悉。下面是我们的代码> SETTHELADMEND> /CODE的内部(类似于混合的原生C++、C++/CLI、C++应用程序):


调试器需要看到此异常,第一次通知会处理此异常。在扩展中运行此程序时,devenv.exe上没有附加调试程序。不知道为什么CLR会介入。有趣。但是,发生这种情况时,附加了一个调试器。事实上,我当时正在用另一个devenv.exe会话调试它。最终我选择了简单地注释掉线程重命名,但您的方式似乎也起到了作用。谢谢
#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)