你所尝试的显然是错误的,但问题是你是否理解它的问题所在。_beginthread
将指向函数的指针(具有特定的原型和调用约定)作为其第一个参数。
当你写
HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);
您正在尝试传递调用(在当前线程中)_beginthread
的结果,它是一个,而期望一个(指向一个函数的指针并返回一个参数)。ShellExecute
HINSTANCE
_beginthread
void( __cdecl *)( void * )
__cdecl
void*
void
不仅您的代码不起作用,因为您试图将HINSTANCE
函数传递给预期指针的位置,而且没有任何意义。你读过_beginthread
文档吗?那里有例子。复数。
你要写的是:
HANDLE hThread = (HANDLE) _beginthread(ThreadFunc, 0, NULL);
给定:
void __cdecl ThreadFunc(void*) {
ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);
}
或者,以更紧凑且易于阅读的形式:
HANDLE hThread = (HANDLE)
_beginthread([](void*) {
ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);
},
0, NULL);
除非你正在做一些超出我们在这里看到的事情,否则大卫的评论可能是正确的,你应该使用std::thread
or std::async
。
另请注意,将_beginthread
(int 与_beginthreadex
or的结果形成对比CreateThread
) 的结果视为不安全,因为它可能无效,如文档中所述。不仅如此,而且_beginthread
' 的返回值并不是真正的 a HANDLE
(它是一个句柄的痛处,但不是一个HANDLE
!),所以你不能WaitForSingleObject
在它上面:
该_beginthreadex
函数使您可以更好地控制线程的创建_beginthread
方式。_endthreadex
功能也更加灵活。例如_beginthreadex
,您可以使用安全信息,设置线程的初始状态(运行或挂起),并获取新创建线程的线程标识符。您还可以使用_beginthreadex
同步 API_beginthread
返回的线程句柄,而.
使用起来_beginthreadex
比_beginthread
. 如果由 生成的线程_beginthread
快速退出,返回给调用者的句柄_beginthread
可能无效或指向另一个线程。但是,返回的句柄_beginthreadex
必须由 的调用者关闭,因此如果没有返回错误_beginthreadex
,则可以保证它是有效的句柄。_beginthreadex
由于这个线程只调用一个函数并退出,它几乎最大化了这个句柄无效的机会。即使是这样,您仍然无法将其用于WaitForSingleObject
.