你所尝试的显然是错误的,但问题是你是否理解它的问题所在。_beginthread将指向函数的指针(具有特定的原型和调用约定)作为其第一个参数。
当你写
HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);
您正在尝试传递调用(在当前线程中)_beginthread的结果,它是一个,而期望一个(指向一个函数的指针并返回一个参数)。ShellExecuteHINSTANCE_beginthreadvoid( __cdecl *)( void * )__cdeclvoid*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::threador std::async。
另请注意,将_beginthread(int 与_beginthreadexor的结果形成对比CreateThread) 的结果视为不安全,因为它可能无效,如文档中所述。不仅如此,而且_beginthread' 的返回值并不是真正的 a HANDLE(它是一个句柄的痛处,但不是一个HANDLE!),所以你不能WaitForSingleObject在它上面:
该_beginthreadex函数使您可以更好地控制线程的创建_beginthread方式。_endthreadex功能也更加灵活。例如_beginthreadex,您可以使用安全信息,设置线程的初始状态(运行或挂起),并获取新创建线程的线程标识符。您还可以使用_beginthreadex同步 API_beginthread返回的线程句柄,而.
使用起来_beginthreadex比_beginthread. 如果由 生成的线程_beginthread快速退出,返回给调用者的句柄_beginthread可能无效或指向另一个线程。但是,返回的句柄_beginthreadex必须由 的调用者关闭,因此如果没有返回错误_beginthreadex,则可以保证它是有效的句柄。_beginthreadex
由于这个线程只调用一个函数并退出,它几乎最大化了这个句柄无效的机会。即使是这样,您仍然无法将其用于WaitForSingleObject.