例如,我需要运行以下命令:
ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);作为新帖子,但我不知道是怎么回事。我试过这个:
HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);
WaitForSingleObject( hThread, INFINITE );但很明显它是错误的,不能被编译。我该怎么做呢?
发布于 2017-01-19 05:53:50
您尝试的内容显然是错误的,但问题是您是否了解它的错误所在。_beginthread将指向函数(具有特定的原型和调用约定)的指针作为其第一个参数。
当你写的时候
HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);您正在尝试向_beginthread传递调用ShellExecute (在当前线程中)的结果代码,它是一个代码,而_beginthread需要一个void( __cdecl *)( void * ) (指向一个__cdecl函数的指针,该函数接受一个void*参数并返回<void*>d13_beginthread>)。
不仅你的代码不能工作,因为你试图将一个HINSTANCE传递给一个需要指向指针的函数,这也没有任何意义。你读过_beginthread documentation吗?这里有一些例子。复数。
你想写的是:
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);除非你正在做我们在这里看到的以外的事情,否则David的评论可能是正确的,你应该使用std::thread或std::async。
还要注意,在不安全的环境中获取_beginthread的结果(与_beginthreadex或CreateThread的结果形成对比),因为它可能是无效的,如文档中所述。不仅如此,_beginthread的返回值也不是真正的HANDLE (它是一个令人头疼的句柄,但不是HANDLE!),所以你不能对它执行WaitForSingleObject:
与
_beginthread相比,_beginthreadex函数使您能够更好地控制线程的创建方式。_endthreadex函数也更加灵活。例如,使用_beginthreadex,您可以使用安全信息,设置线程的初始状态(正在运行或挂起),并获取新创建的线程的线程标识符。通过同步_beginthreadex_beginthread.,您还可以使用由API返回的线程句柄,这是不能通过API实现的
使用_beginthreadex比使用_beginthread更安全。如果_beginthread生成的线程快速退出,则返回给_beginthread调用者的句柄可能无效或指向另一个线程。但是,_beginthreadex返回的句柄必须由_beginthreadex的调用者关闭,所以如果_beginthreadex没有返回错误,就可以保证它是一个有效的句柄。
由于此线程只调用一个函数并退出,因此它几乎最大化了此句柄无效的可能性。即使是,你也不能把它用在WaitForSingleObject上。
https://stackoverflow.com/questions/41723033
复制相似问题