思维调试:调用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?》

思维调试:调用ShellExecute后为什么程序没有启动_第1张图片

你可能感兴趣的:(OldNewThing,软件开发,系统设计,windows)