2011-08-26 164 views
1

下面是一个创建线程的简单程序。我希望我失去一些明显的东西。仅供参考 - 我是Win32的新手。CreateThread()// GetLastError()返回87

为什么线程执行中的GetLastError()返回87(ERROR_INVALID_PARAMETER)?

#include "stdafx.h" 
#include <Windows.h> 
#include <iostream> 

long WINAPI Run(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD id; 

    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Run, NULL, 0, &id);  

    // hThread is not NULL 

    DWORD err = GetLastError(); // returns 0 

    int input; 
    std::cin >> input; 

    return 0; 
} 

long WINAPI Run() 
{ 
    DWORD err = GetLastError(); // returns 87 
    return 0; 
} 
+0

你应该真正使用具有正确签名的回调函数。 –

回答

4

GetLastError()函数只返回有效结果当返回一个“失败”结果的Win32 API函数调用后立即

就你而言,你调用GetLastError()作为新线程中的第一件事,这绝对不是在紧接着Win32 API函数调用之后。

此外,每个线程都有自己的“最后一个错误”副本,因此它们不会互相踩在一起。

+0

嗯。很高兴知道。但是,当我确实调用Win32函数时GetQueuedCompletionStatus时(...)。它返回true,然后如果我调用GetLastError(),则返回87.如果我在GetQueuedCompletionStatus(...)之前调用SetLastError(0),则GetLastError()在调用后返回0。这就是为什么我感到困惑,因为它似乎GetQueuedCompletionStatus()不会将“最后的错误”设置为0或其他有效的成功。所以我是对的,我应该检查false,然后调用GetLastError()? –

+1

没错;如果API函数成功,那么它通常不会设置最后一个错误值(这里有例外;详情请参阅API函数的文档)。 –

+0

谢谢你。来自.NET的土地,这有点不同。 –

相关问题