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

伊加尔·塔巴尼克(Igal Tabachnik)

我在调试开源记事本替换中的功能Notepad2时偶然发现了一个问题(更具体地说,是一个名为Notepad2-mod的较新的fork )。

它具有一个标志/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中,但是没有可见的窗口。

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

尝试从cmd shell启动此程序时,一切正常。

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

从cmd发射

STARTUPINFO MSDN条目,该值wShowWindow应该匹配的值nCmdShow,如果dwFlagsSTARTF_USESHOWWINDOW在里面。但是,在这两种情况下(从VS和cmd启动),其值dwFlags均为0。

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

汉斯·帕桑特

我将其写出来,这是一个非常棒的错误。它特定于VS2015调试引擎,因存在很多错误而臭名昭著。通过禁用它,您可以自己看到一些东西。工具>选项>调试>常规>勾选“使用本机兼容模式”选项。这迫使使用较旧的调试引擎,您现在始终可以获取STARTUPINFO.nCmdShow == SW_SHOWNORMAL。

有一个微不足道的理由可以断言这是故意的,不宜盲目地遵循nCmdShow建议。它是一种恶意软件攻击媒介,允许它在不通知用户的情况下启动程序。许多程序故意忽略SW_HIDE,这不是一件很直观的事情,而且很容易忽略。您需要装满一半以上的杯子来进行这种解释,但是,通常使用WinMain()的nCmdShow参数,它是正确的。

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

因此,我投票给Bug,请使用connect.microsoft.com进行报告。在评论中添加指向反馈文章的链接,我们将对其投票。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

运行时未部署Visual Studio

来自分类Dev

Visual Studio Code 终端未以秒为单位显示脚本失败错误消息、规范数和脚本运行时

来自分类Dev

每次我运行时,Visual Studio都会构建项目

来自分类Dev

通过Visual Studio运行时忽略IE中的缓存

来自分类Dev

Visual Studio 2012中的运行时不匹配

来自分类Dev

在Visual Studio上运行时程序变慢

来自分类Dev

从Visual Studio运行时,PowerShell脚本结果不同

来自分类Dev

Visual Studio 2010无法安装VC 9.0运行时

来自分类Dev

{c ++}程序在没有安装Visual Studio的计算机上运行时发送错误0xc00007b

来自分类Dev

脚本在Visual Studio中运行,但从批处理文件运行时则无法运行

来自分类Dev

Visual Studio 2012中的Visual C ++运行时可分发2010

来自分类Dev

在Visual Basic(Visual Studio 2019)的运行时中创建的ListView中的索引选择

来自分类Dev

Visual Studio 2010的Visual C ++ 2012运行时库先决条件

来自分类Dev

从Windows运行而不是从Visual Studio运行时,C#/ C ++应用程序崩溃

来自分类Dev

在 PATH 上找不到运行时“节点”。在 Ubuntu 18.04 上运行的 Visual Studio Code 中

来自分类Dev

Microsoft Visual Basic运行时错误

来自分类Dev

Visual Studio 2010 SP1设计时间与运行时的呈现方式不同

来自分类Dev

在没有MSVCRT运行时的情况下在Visual Studio 2012中编译C

来自分类Dev

在应用程序运行时随时启动Visual Studio调试器

来自分类Dev

Visual Studio的设置,以在运行时删除对dll文件的依赖

来自分类Dev

为什么Visual Studio运行时库源代码存储在两个目录中?

来自分类Dev

如何在运行时在Visual Studio中编辑C#代码,而不是编辑并继续

来自分类Dev

Visual Studio WPF窗口在运行时会收缩吗?

来自分类Dev

程序集属性的Visual Studio 2013运行时文本模板

来自分类Dev

在不同凭据下运行时,在Visual Studio当前实例中打开文件

来自分类Dev

将Worklight项目作为Visual Studio项目运行时出错

来自分类Dev

使用clang和Visual Studio 2013运行时从OS X交叉编译到Windows

来自分类Dev

Visual Studio 2015运行时依赖项或如何摆脱Universal CRT?

来自分类Dev

当与Visual Studio 2015一起运行时,OpenCV无法打开视频文件

Related 相关文章

  1. 1

    运行时未部署Visual Studio

  2. 2

    Visual Studio Code 终端未以秒为单位显示脚本失败错误消息、规范数和脚本运行时

  3. 3

    每次我运行时,Visual Studio都会构建项目

  4. 4

    通过Visual Studio运行时忽略IE中的缓存

  5. 5

    Visual Studio 2012中的运行时不匹配

  6. 6

    在Visual Studio上运行时程序变慢

  7. 7

    从Visual Studio运行时,PowerShell脚本结果不同

  8. 8

    Visual Studio 2010无法安装VC 9.0运行时

  9. 9

    {c ++}程序在没有安装Visual Studio的计算机上运行时发送错误0xc00007b

  10. 10

    脚本在Visual Studio中运行,但从批处理文件运行时则无法运行

  11. 11

    Visual Studio 2012中的Visual C ++运行时可分发2010

  12. 12

    在Visual Basic(Visual Studio 2019)的运行时中创建的ListView中的索引选择

  13. 13

    Visual Studio 2010的Visual C ++ 2012运行时库先决条件

  14. 14

    从Windows运行而不是从Visual Studio运行时,C#/ C ++应用程序崩溃

  15. 15

    在 PATH 上找不到运行时“节点”。在 Ubuntu 18.04 上运行的 Visual Studio Code 中

  16. 16

    Microsoft Visual Basic运行时错误

  17. 17

    Visual Studio 2010 SP1设计时间与运行时的呈现方式不同

  18. 18

    在没有MSVCRT运行时的情况下在Visual Studio 2012中编译C

  19. 19

    在应用程序运行时随时启动Visual Studio调试器

  20. 20

    Visual Studio的设置,以在运行时删除对dll文件的依赖

  21. 21

    为什么Visual Studio运行时库源代码存储在两个目录中?

  22. 22

    如何在运行时在Visual Studio中编辑C#代码,而不是编辑并继续

  23. 23

    Visual Studio WPF窗口在运行时会收缩吗?

  24. 24

    程序集属性的Visual Studio 2013运行时文本模板

  25. 25

    在不同凭据下运行时,在Visual Studio当前实例中打开文件

  26. 26

    将Worklight项目作为Visual Studio项目运行时出错

  27. 27

    使用clang和Visual Studio 2013运行时从OS X交叉编译到Windows

  28. 28

    Visual Studio 2015运行时依赖项或如何摆脱Universal CRT?

  29. 29

    当与Visual Studio 2015一起运行时,OpenCV无法打开视频文件

热门标签

归档