从 Visual Studio 运行时,STARTUPINFO.wShowWindow 为 0

2024-04-23

我在调试名为 Notepad2 的开源记事本替代品中的功能时偶然发现了一个问题(更具体地说,是一个名为 Notepad2 的更新版本)Notepad2-mod https://github.com/XhmikosR/notepad2-mod).

它有一面旗帜/u这会导致应用程序在管理权限下自行重新启动(使用runas与 ShellExecute 一起使用的动词)。代码如下所示(为简洁起见,进行了删减):

STARTUPINFO si;
SHELLEXECUTEINFO sei;

si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);

ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
...
sei.lpVerb = L"runas";
sei.lpFile = lpArg1;
sei.lpParameters = lpArg2;
sei.nShow = si.wShowWindow;

ShellExecuteEx(&sei);

由于某种原因,如果我从 Visual Studio 启动它(无论是否附加调试器),提升的子进程的主窗口将不会显示!它将出现在 Process Explorer 中,但没有可见的窗口。

经过调查,我意识到nCmdShow传递给子进程'WinMain为 0(对应于SW_HIDE)当从 Visual Studio 启动时!该值随后被传递给ShowWindow,这就是它没有显示的原因。

当尝试从 cmd shell 启动它时,一切正常。

经过进一步调查发现,其价值si.wShowWindow,通过调用获得GetStartupInfo在 VS 中运行时为 0,但从 cmd 启动时为 1:

根据STARTUPINFO MSDN 条目 https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx,值wShowWindow应该匹配的值nCmdShow if dwFlags has STARTF_USESHOWWINDOW在里面。但是,在这两种情况下(从 VS 和 cmd 启动),值dwFlags was 0.

那么,这是 VS 的问题还是我只是认为错误?


我会把这个写下来,这是一个非常棒的错误。它是针对 VS2015 调试引擎的,因存在大量错误而臭名昭著。您可以通过禁用它来亲自看到一些东西。工具>选项>调试>常规>勾选“使用本机兼容模式”选项。这会强制使用较旧的调试引擎,您现在始终会得到 STARTUPINFO.nCmdShow == SW_SHOWNORMAL。

有一个小极端情况可以证明这是故意的,盲目遵循 nCmdShow 建议是不可取的。它是一种恶意软件攻击媒介,可以在用户不注意的情况下启动程序。许多程序故意忽略 SW_HIDE,这不是一件非常直观的事情,而且很容易被忽视。您需要一个超过半满的玻璃杯才能做出这种解释,但是,WinMain() 的 nCmdShow 参数是通常使用的参数,并且它是正确的。

这也是您可以使用的解决方法。当然,在这种特定情况下,您永远不应该依赖启动值并根据 Notepad++ 主窗口的当前状态传递 SW_SHOWNORMAL 或 SW_SHOWMAXIMIZED 。

所以我投票错误,使用 connect.microsoft.com 来报告它。在评论中添加反馈文章的链接,我们将对其投票。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Visual Studio 运行时,STARTUPINFO.wShowWindow 为 0 的相关文章

随机推荐

  • 如何在scala Spark中按键连接两个数据集

    我有两个数据集 每个数据集都有两个元素 以下是示例 数据1 名称 动物 abc def monkey 1 df gh zebra 数据2 名称 水果 a efg apple abc def banana 1 预期结果 名称 动物 水果 ab
  • 初始化字符串时额外的花括号

    根据问题string array 是什么意思 是什么意思以及为什么它有效 https stackoverflow com questions 21481462 what does this code mean and why does it
  • 如何检测(心电图)波的模式?

    我正在尝试读取心电图图像并检测其中的每个主波 P 波 QRS 波群和 T 波 我可以读取图像并获得向量 例如 4 2 4 4 4 9 4 7 我需要一种算法来遍历这个向量并检测每个波何时开始和结束 一个例子 如果它们总是具有相同的大小 或者
  • #pragma pack、模板类型定义和结构对齐

    使用 Visual Studio 或 gcc 如果有的话 pragma pack push 16 typedef std map
  • 如何在Pythonlogging.Formatter中右对齐级别字段

    我目前正在尝试右对齐 Python 记录器中的日志记录级别字段 以便输出如下 2011 10 14 13 47 51 DEBUG starting smtphandlers py 96 2011 10 14 13 47 51 INFO fi
  • 重定向后的 HTTP 响应代码

    有一个到服务器的信息重定向 一旦来自服务器的响应 我想检查 HTTP 代码以抛出异常 如果有任何以 4XX 开头的代码 为此 我需要知道如何从标头中仅获取 HTTP 代码 这里还涉及到服务器的重定向 所以我担心curl 对我来说没有用 到目
  • Java 链表数组

    我正在尝试编写一个可以允许多个值的自定义哈希表 我们正在通过以下方式进行 创建大小为 Integer MAX 的链表数组 自定义链表 将值 int 插入到编号为键编号的链接列表中 表示结构如下 value1 gt value6 NULL N
  • 无法在 iPhone 6 上打开 Apple Pay 表

    我想制作一个示例项目 当用户单击我的应用程序上的 使用 Apple Pay 付款 按钮时 该项目会打开 Apple Pay 表 我在配备 iOs 版本 8 1 包含 Apple Pay 和 Xcode 6 1 GM 的 iPhone 6 上
  • 如何检测 android RecyclerView 中的 OverScroll?

    我尝试覆盖 onOverScrolled 但它没有被触发 public class MyRecyclerView extends RecyclerView public MyRecyclerView NonNull Context cont
  • 将 ed25519 私钥 ssh 转换为 RSA 私钥

    我正在寻找使用将 ed25519 私钥转换为 rsa 私钥ssh keygen I found 这个有用的指南 https man openbsd org ssh keygen但我无法弄清楚如何指定输入格式为 ed25519 并且导出格式应
  • 用 C++ 发出声音(嘟嘟声)

    如何用c 使硬件发出蜂鸣声 打印特殊字符 ASCII BEL 代码7 cout lt lt a Source https bytes com topic c answers 127539 making computer speaker be
  • 如何在align环境中标记每个方程?

    我想知道如何在对齐环境中标记每个方程 例如 begin align label eq lnnonspbb lambda i mu i 0 mu i xi i 0 lambda i y i w T x i b 1 xi i 0 end ali
  • 我可以 POST 和 GET 到同一个 PHP 页面吗

    例如 我想知道是否可以在同一个 php 页面上进行 GET 和 POST 我想将数据发送到 http www example com my php 所以首先是 GET http www example com my php task dos
  • 使用VBS脚本检查字符串是否包含特定字符

    我的脚本正在做以下几点 检索所有我选择的文件夹文件 按日期对它们进行分类 从最近的到较早的 在窗口中显示它们 这是我的 VBS 脚本 我检索它here http codes sources commentcamarche net sourc
  • tkinter .after() 秒和分

    大家好 我在 tkinter 中制作计时器时遇到问题 但我无法使用time sleep 所以我用 after 我有新问题 我输入了一个条目 我希望条目编号为 60 在设定时间之后 将写入一条文本 内容如下 gt gt time is ove
  • Excel 单元格值作为 SQL 查询 where 语句

    我对 SQL 很陌生 我想使用此查询将数据从 SQL Server 导入到 Excel SELECT Model Factory TargetTime TotalEvalMins FROM AMSView WHERE WeekNumber
  • CoreImage坐标系

    I have CVPixelBufferRef从一个AVAsset 我正在尝试申请CIFilter到它 我用这些行 CVPixelBufferRef pixelBuffer CVPixelBufferRef newPixelBuffer e
  • 有条件地设置对象属性

    是否有一些根据条件设置属性的语法 data userId 7 actionId 36 express myCondition true null does not work I want express要么设置为一个值 要么根本不设置 即
  • ListView.builder 在颤振中按像素底部溢出

    这就是我使用的方式ListView builder它被纳入Column with Expanded小部件 我尝试了一些解决方案 但它们不起作用 这是一个动态列表 return Container child Column crossAxis
  • 从 Visual Studio 运行时,STARTUPINFO.wShowWindow 为 0

    我在调试名为 Notepad2 的开源记事本替代品中的功能时偶然发现了一个问题 更具体地说 是一个名为 Notepad2 的更新版本 Notepad2 mod https github com XhmikosR notepad2 mod 它