思维调试:调用ShellExecute后为什么程序没有启动

今天的问题来自我的一位读者:

“如果我在命令行下启动我的程序,一切都是正常的。但是,当我在代码中调用 ShellExecuteEx 来启动程序时,好像什么都没有发生,这是为什么?”

在我问下面的第二个能给出答案的问题之前,你可以自己思考下大概问题的原因出在哪里?

下面是来自另外一个读者的问题反馈,它和上面这个十分类似:

“我正在尝试使用 ShellExecute 打开一个文档。函数正常返回了(返回值大于 32),但是屏幕上没有显示任何东西。我的代码如下:
if (ShellExecute(Handle, NULL, FileName, NULL,
NULL, NULL) <= (HINSTANCE)32) …

第二个读者的代码中,最后一个参数出了问题。这个参数 nShowCmd,从字面意思来看,应该需要传递一个 SW_* 的值,但是他却传递了 NULL。

碰巧的是,NULL 的值为 0,而 0 对应于 SW_HIDE,这就解释了为什么程序没有出现:是你告诉它以隐藏的方式运行的!

下面,让我们回到第一个读者的问题。你看到这个人最有可能做错了什么吗?代码大概是这样的:

SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.hwnd = hwnd;
sei.lpVerb = TEXT(“open”);
sei.lpFile = pszFile;
ShellExecuteEx(&sei);

由于未显式设置 sei.nShow 成员,因此不完整的初始值设定项将该值隐式设置为 0。正如我们上面提到的,0 意味着 SW_HIDE。

事实证明,我的思维调试是正确的。这确实是第一位读者反馈问题的根源。
现在你也可以使用你的精神力量了。

总结

虽然的确是我们的代码没有设置正确的参数,但是这个默认行为着实有点令人费解。
还是尽量弄明白每个参数的意思吧,坑多着呢!

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Psychic debugging: Why doesn’t my program show up when I call ShellExecute?》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拓扑梅尔-漫漫开发路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值