2009-07-01 28 views
2

我覺得這有一個明顯的答案,但它一直在逃避我。我在C++中有一些遺留代碼,當它嘗試調用OpenThread()時會中斷它。我在Visual C++ 2008 Express Edition中運行它。程序首先獲取調用線程的ThreadID並嘗試打開它,如下所示:OpenThread()返回NULL Win32

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

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

現在這裏是我不明白的:如果線程ID是當前線程的ID,是不是已經打開?那可能是爲什麼它返回NULL?

任何反饋將不勝感激。

回答

5

也許你要求太多的訪問權限(THREAD_ALL_ACCESS),儘管我認爲你幾乎擁有所有權限給自己的線程。嘗試減少你真正需要的訪問。

GetLastError()返回什麼?

更新:

看看從MSDN此評論:WINDOWS

Windows Server 2003和XP/2000年: THREAD_ALL_ACCESS標誌的大小 的Windows Server 2008和Windows上增加Vista系統。 如果應用程序編譯爲Windows Server 2008和Windows Vista中的Windows Server 2003上運行 或Windows XP/2000中,THREAD_ALL_ACCESS標誌 過大且功能指定 這個標誌失敗 ERROR_ACCESS_DENIED。要避免此問題,請指定 操作所需的最小訪問權限集 。如果使用THREAD_ALL_ACCESS必須使用 ,請將您的應用程序(例如, #define _WIN32_WINNT _WIN32_WINNT_WINXP)設置爲 所針對的最低操作系統_WIN32_WINNT至 。欲瞭解更多信息,請參閱使用Windows 接頭

+0

ThREAD_ALL_ACCESS顯然是問題所在。我使用了THREAD_SET_INFORMATION,它做到了。非常感謝! – RCC 2009-07-01 15:53:30

0

嘗試使用_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; 
} 
+0

這不會啓動一個新的線程? – 2015-09-21 11:05:14