思维调试:调用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?》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: 如何将一个 HRESULT 转换为 Win32 错误码?
- 上一篇: 用户自定义消息及层次划分
相关推荐
- STL大牛Stephan T. Lavavej访谈
- Posted on 10月15日
- 新玩意: 利用VS2019的代码导航功能来快速了解CMake工程
- Posted on 02月19日
- 在Program Files文件夹下的Xerox是干啥的?
- Posted on 12月24日
- VS2019操作CMake工程?进一步地轻轻松松!
- Posted on 02月20日
评论已关闭。