首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_beginthread中的ShellExecute

_beginthread中的ShellExecute
EN

Stack Overflow用户
提问于 2017-01-18 23:17:59
回答 1查看 615关注 0票数 0

例如,我需要运行以下命令:

代码语言:javascript
复制
ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);

作为新帖子,但我不知道是怎么回事。我试过这个:

代码语言:javascript
复制
HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);
WaitForSingleObject( hThread, INFINITE );

但很明显它是错误的,不能被编译。我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2017-01-19 05:53:50

您尝试的内容显然是错误的,但问题是您是否了解它的错误所在。_beginthread将指向函数(具有特定的原型和调用约定)的指针作为其第一个参数。

当你写的时候

代码语言:javascript
复制
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吗?这里有一些例子。复数。

你想写的是:

代码语言:javascript
复制
HANDLE hThread = (HANDLE) _beginthread(ThreadFunc, 0, NULL);

给定:

代码语言:javascript
复制
void __cdecl ThreadFunc(void*) {
    ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);
}

或者,以一种更简洁、更易于阅读的形式:

代码语言:javascript
复制
HANDLE hThread = (HANDLE)
                 _beginthread([](void*) {
                     ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);
                 },
                 0, NULL);

除非你正在做我们在这里看到的以外的事情,否则David的评论可能是正确的,你应该使用std::threadstd::async

还要注意,在不安全的环境中获取_beginthread的结果(与_beginthreadexCreateThread的结果形成对比),因为它可能是无效的,如文档中所述。不仅如此,_beginthread的返回值也不是真正的HANDLE (它是一个令人头疼的句柄,但不是HANDLE!),所以你不能对它执行WaitForSingleObject

_beginthread相比,_beginthreadex函数使您能够更好地控制线程的创建方式。_endthreadex函数也更加灵活。例如,使用_beginthreadex,您可以使用安全信息,设置线程的初始状态(正在运行或挂起),并获取新创建的线程的线程标识符。通过同步_beginthreadex _beginthread.,您还可以使用由API返回的线程句柄,这是不能通过API实现的

使用_beginthreadex比使用_beginthread更安全。如果_beginthread生成的线程快速退出,则返回给_beginthread调用者的句柄可能无效或指向另一个线程。但是,_beginthreadex返回的句柄必须由_beginthreadex的调用者关闭,所以如果_beginthreadex没有返回错误,就可以保证它是一个有效的句柄。

由于此线程只调用一个函数并退出,因此它几乎最大化了此句柄无效的可能性。即使是,你也不能把它用在WaitForSingleObject上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41723033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档