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

  • 相关阅读:
    Android ArrayMap源码解析
    高级IO/多路转接-select/poll(1)
    Flink学习笔记(5)——DataSteam API
    学习-Java数组之foreach遍历数组之正负数数量统计
    JSP Webshell 免杀
    代码随想录-015-剑指Offer206. 反转链表
    安卓经验分享——图片加载
    Spring项目-前端问题:Can‘t find variable:$
    (已导出) hyperv中的ubuntu虚拟机双网卡设置
    UCI手写数字的数据降维
  • 原文地址:https://blog.csdn.net/mmxida/article/details/134281078