OpenThread()返回NULL Win32

我觉得这个问题有一个明显的答案,但这个问题一直困扰着我。 我在C ++中有一些遗留代码,当它尝试调用OpenThread()时会中断。 我在Visual C ++ 2008 Express Edition中运行它。 程序首先获取调用线程的ThreadID,并尝试打开它,如下所示:

ThreadId threadId = IsThreaded()? thread_id::: GetCurrentThreadId();

HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId);

现在这是我不明白的:如果线程ID是当前线程的ID,是不是已经打开? 那可能是为什么它返回NULL?

对于任何反馈,我们都表示感谢。

Solutions Collecting From Web of "OpenThread()返回NULL Win32"

也许你要求太多的访问权限( THREAD_ALL_ACCESS ),虽然我认为你几乎拥有你自己的线程权限。 尝试减少你真正需要的访问。

GetLastError()返回什么?

更新:

看一下这个来自MSDN的评论:

Windows server 2003和Windows XP / 2000:Windows server 2008和Windows Vista上增加了THREAD_ALL_ACCESS标志的大小。 如果为Windows server 2008和Windows Vista编译的应用程序在Windows server 2003或Windows XP / 2000上运行,则THREAD_ALL_ACCESS标志太大,指定此标志的函数将因ERROR_ACCESS_DENIED失败。 为避免此问题,请指定操作所需的最小访问权限集。 如果必须使用_WIN32_WINNT ,请将_WIN32_WINNT设置为应用程序所针对的最低操作系统(例如#define _WIN32_WINNT _WIN32_WINNT_WINXP )。 有关更多信息,请参阅使用Windows头

尝试使用_beginthreadex而不是OpenThread。 例:

 HANDLE hThread; UINT uiThreadId = 0; hThread = (HANDLE)_beginthreadex(NULL, // Security attributes 0, // stack &this->ThreadProc, // Thread proc this, // Thread param CREATE_SUSPENDED, // creation mode &uiThreadId); // Thread ID if (hThread != NULL){ //SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); ResumeThread(hThread); m_hThread = hThread; } else{ eRetVal = err_ThreadStartErr; }