CreateProcess 在 Windows 7 下不会创建额外的控制台窗口?

2023-11-21

我正在尝试使用 CreateProcess(...) 运行一个进程,并在单独的控制台窗口中独立运行它。

我可以使用 system("...") 函数来实现这一点,但我更喜欢 CreateProcess,因为它使我可以指定环境和工作目录,获取进程的句柄,以及在需要时通过管道传输 stdin/out到。

我在互联网上找到的只是相反的问题,即人们拥有额外的控制台窗口并希望摆脱它们!打开并显示新的控制台窗口似乎是早期版本的 Windows 中的正常行为?

现在,即使我运行“cmd.exe /c ...”,我也无法获得额外的窗口

我尝试使用 STARTF_USESHOWWINDOW 标志,但没有成功。

有人遇到过这个问题吗?

PS.:GUI 窗口如图所示。 notepad.exe 将正常出现。

这是我的代码(本质上)

PROCESS_INFORMATION processInfo;
STARTUPINFOA startupInfo;
ZeroMemory(&startupInfo,sizeof(startupInfo));
startupInfo.dwFlags |= CREATE_NEW_CONSOLE;
startupInfo.dwFlags |= DETACHED_PROCESS;
ok&=CreateProcessA( NULL,
    const_cast<char*>(comand.c_str()), // safe for CreateProcessA
    NULL, NULL, TRUE, NULL, NULL, NULL,
    &startupInfo, &processInfo);

我正在尝试运行 C:/Windows/system32/cmd.exe /c help 程序运行,我可以从管道读取输出。还是没有窗户。


MSDN 确实是您使用 Win32 API 时最好的朋友。现在,与您相关的创建标志如下:

(no flags set)— 子进程(以CreateProcess())将与父进程(调用的进程)共享控制台CreateProcess()).

CREATE_NEW_CONSOLE— 子进程将收到一个新控制台,在新窗口中打开。正如 MSDN 明确指出的那样,该标志不得与 DETACHED_PROCESS!这正是您想要使用的标志。

CREATE_NO_WINDOW— 子进程将收到一个新的控制台,但没有任何窗户。这是一个非常令人惊讶的标志,所以我将再次重申:子进程将有一个控制台,您可以在其中写入输出,您可以尝试从中读取输入等;该控制台与父进程的控制台不同;这个控制台是不可见的,它没有可见的窗口,但它存在。例如,它对于在后台静默运行子进程很有用。请注意,此标志在与CREATE_NEW_CONSOLE or DETACHED_PROCESS— 这些标志会覆盖这个标志。另请记住,当您启动 GUI 应用程序时,该标志将被忽略:它不会收到不可见的控制台。

DETACHED_PROCESS— 子进程不会收到任何控制台。您不得将此标志与 CREATE_NEW_CONSOLE.

现在更多关于正确调用CreateProcess()。首先,你应该使用CreateProcessW()。我特别厌倦了无法访问名为的目录中的文件的应用程序日本語αβηλ.

其次,即使使用 ANSI 版本,也要指定CREATE_UNICODE_ENVIRONMENT如果你通过了,请标记NULL为了环境。如果你不这样做,PATH可能最终会在子进程中被破坏,并且这个错误很难追踪。

第三,不要const_cast<char*>command.c_str()。只需致电strdup()/wcsdup()在其上,然后free()之后CreateProcess()呼叫返回。或者如果你真的坚持要修改command到位,通过&command[0]作为参数。

第四,不要忘记设置你的尺寸STARTUPINFO结构:startupInfo.cb = sizeof(startupInfo)。现代 Windows(至少是 XP 和 7)实际上允许您将此字段保留为零,而不会产生任何有害后果,但依赖此进行编程有点草率。

哦,当我们在这里时:你提到你使用CreateProcess()因为,除其他外,它允许您显式地为孩子指定环境。嗯,有一个小问题lpEnvironment参数已记录,但很容易被忽视。当您指定NULL,孩子继承了父母的环境。当您指定非NULL, 父级环境未添加到其中。如果你想添加到父环境中,你必须使用GetEnvironmentStrings()获取它然后明确地调整它。

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

CreateProcess 在 Windows 7 下不会创建额外的控制台窗口? 的相关文章

  • 全局拦截窗口移动

    我无法让全局系统挂钩正常工作 我希望在窗口移动时尽早收到通知 并更改窗口大小 这意味着 CBT 钩子HCBT MOVESIZE不会削减它 它只会在窗口移动后发生 我想挂钩窗口的实际移动 并能够在移动过程中更改窗口大小 挂钩是从 DLL 设置
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 如何在 Perl 中修改 Windows NTFS 权限?

    我在 Windows Server 2003 上使用 ActiveState Perl 我想在 Windows NTFS 分区上创建一个目录 然后授予 Windows NT 安全组对该文件夹的读取访问权限 这在 Perl 中可能吗 我必须使
  • WndProc调用机制(WinAPI)

    我试图了解 Windows 应用程序是如何工作的 有一个WndProc函数 其中发生消息处理 LRESULT CALLBACK WndProc HWND hwnd UINT msg WPARAM wParam LPARAM lParam s
  • 如何在 C++ 中使用 LoadLibrary(..) 调用 kernel32.dll 函数 GetTickCount()

    我正在寻找一个在 Windows 机器上获取以毫秒为单位的时间的函数 本质上 我想调用这个 WinAPI 函数 GetTickCount 但我陷入了 使 用 LoadLibrary n 调用 GetTickCount 函数 部分 我搜索了每
  • 如何按名称杀死进程? (Win32 API)

    基本上 我有一个将启动多次的程序 因此 该程序将启动两个或多个进程 我想使用 Win32 API 并终止 终止具有特定名称的所有进程 我见过杀死一个进程的例子 但没有看到多个具有完全相同名称 但参数不同 的进程 尝试下面的代码 killPr
  • 在 Windows Vista 和 Windows 7 上使用 HEAP_NO_SERIALIZE 的堆内存函数速度减慢约 100 倍的原因

    我正在尝试追踪 Windows Vista 和 Windows 7 中堆内存功能的巨大减慢 我没有在任何服务器版本上进行测试 这种情况在 Windows XP 上根本不会发生 只会在 Microsoft 较新的操作系统上发生 我最初在 Wi
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 了解 VerQueryValue

    在 MSDN 上 我注意到 VerQueryValue 函数的以下内容 lplp缓冲区 输出 低电压空洞当此方法返回时 包含指向 pBlock 指向的缓冲区中所请求版本信息的指针的地址 当关联的 pBlock 内存被释放时 lplpBuff
  • 注册表碎片整理程序[重复]

    这个问题在这里已经有答案了 这是出于好奇 但我见过几个 其中一些非常流行 称为注册表碎片整理程序的软件 虽然我可以看到它们提供的好处 但我很好奇您到底是如何进行注册表碎片整理的 请注意 我并不是要求提供软件名称 只是询问其如何以编程方式完成
  • 即使我使用 SetWindowTextW(),Unicode 文本在编辑框中显示为问号

    我遇到了 unicode 文件名在编辑框中显示为问号的问题 当我将 unicode 字符 例如阿拉伯语或泰语 粘贴到编辑框中时 它们会正确显示 但在运行此代码后 它们会变成问号 怎么会 WCHAR buf 100 GetWindowText
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 避免 UAC 但使用 Windows 服务启动提升的进程

    我有一个非交互式服务作为 Windows 计算机上的特权系统用户运行 我需要它来启动给定的可执行文件作为提升的进程 我已设法使用 WTSGetActiveConsoleSessionId 以 SYSTEM 身份启动一个子进程 找到一个系统进
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您
  • 如何使用 WinAPI 读取 MessageBox 文本

    如何读取标准Win消息框 Info 的消息 Using SendMessage this HandleControl WM GETTEXT builder Capacity builder 我只能读取消息框的标题或按钮的文本 但不能读取消息
  • WM_NEXTDLGCTL 可以与非对话框窗口一起使用吗?

    的文档WM NEXTDLGCTL https msdn microsoft com en us library windows desktop ms645432 aspx声明该消息将与对话框一起使用 发送到对话框过程以将键盘焦点设置到对话框
  • 尝试使用 C++ 创建一个计划任务运行一次,win7 上的任务计划程序 1.0

    我正在尝试创建一个非常简单的程序 它将在两分钟后运行记事本 这些都经过简化以提出更清晰的问题 我尝试合并一些MSDN 的例子 http msdn microsoft com en us library windows desktop aa3
  • Windows 中的 JNA:使用 Windows 作业自动终止子进程

    我需要在 Windows 中的 java 应用程序中启动一个子进程 最终可以通过任务管理器杀死 终止我的 java 应用程序 因此 我需要将此子进程与父进程 链接 如果父进程终止 则两者都会终止 在 Windows API 中我们有创建作业

随机推荐

  • 在bash中提取不带路径和扩展名的文件基名[重复]

    这个问题在这里已经有答案了 给定如下文件名 the path foo txt bar txt 我希望得到 foo bar 为什么这不起作用 bin bash fullfile 1 fname basename fullfile fbname
  • “grep -q”不以“tail -f”退出

    我正在尝试实现一个等待日志文件中特定消息的脚本 记录消息后 我想继续执行脚本 这是我正在尝试的tail f and grep q tail f logfile grep q Message to continue The grep永远不会退
  • 使用 Reactjs 的 Axios Post 表单

    所以我用 Axios 有这个 post 方法 如果我提交这个 它说 未捕获 承诺 错误 网络错误 在创建错误 createError js 16 在 XMLHttpRequest handleError xhr js 87 如果我使用这个方
  • 壁虎驱动器和木偶之间的区别[重复]

    这个问题在这里已经有答案了 我不完全理解之间的区别壁虎司机 and 木偶 谁能澄清它们之间的区别 例如 当我使用 Selenium WebDriver 来控制 Firefox 浏览器时 我需要一个 geckodriver 二进制文件来监听W
  • 角度分量进入传单弹出窗口

    无法弄清楚如何将组件生成到传单弹出窗口中 我尝试过两件事 首先 将组件选择器集成到 html 中 但看起来 Angular 没有编译它 let my geojson L geoJSON data onEachFeature feature
  • ASP.NET MVC3 Razor - 在回发时保持滚动位置

    对使用 MvcContrib 框架的网格表进行排序后 如何在回发时保持滚动位置 通常的方法是使用一些 javascript 将当前滚动位置设置为隐藏字段 然后在页面加载时恢复该位置 通常在 jquery 就绪事件中 然而 这实际上只是一个副
  • 无法从docker拉取镜像,ProcessUtilityVMImage找不到指定的路径

    我制作了一个 net core 应用程序并将其上传到 docker hub 当我尝试将其拉到我自己的机器上时 win 10 它就可以工作 当我尝试将其拉到服务器 服务器 2016 时 出现错误 docker pull arrivaflg f
  • 如何统计每个类别的商品数量?

    我想对网站上的产品进行过滤 像这样的东西 Department lassics 13 395 Literary 111 399 History 68 606 Format HTML 3 637 PDF 8 Audio CD 443 Lang
  • 根据查询计数

    给定一个包含 N 个正元素的数组 假设我们列出了数组 A 的所有 N N 1 2 个非空连续子数组 然后用相应子数组中存在的最大元素替换所有子数组 所以现在我们有 N N 1 2 个元素 其中每个元素都是其子数组中的最大值 现在我们有 Q
  • 如何右对齐

    标签?

    我有几个 p 我想要右对齐的标签 有谁知道如何做到这一点 CSS p text align right INLINE p p style text align right Some Text p jQuery p css text alig
  • 如何使用 flutter google_maps 插件获取可见地图的边界?

    我试图找出 flutter 的谷歌地图插件中谷歌地图可见部分的边界框是什么 可以获得吗 如果不是 是否可以根据缩放级别和地图中心的纬度 经度来计算边界框 那将是GoogleMapController getVisibleRegion
  • 如何从 Azure DevOps 中的 YAML 管道获取阶段结果

    到目前为止 我正在使用Azure DevOps REST Api从 Azure DevOps 中的版本获取数据以用于报告目的 显然 这将随着使用 CI CD gt YAML 和多阶段管道 当前预览 的新方式而改变 在这种情况下 构建和发布策
  • 分块读取大文件c#

    我想逐块读取非常大的文件 4GBish 我目前正在尝试使用StreamReader和Read 读取方法 语法是 sr Read char buffer int index int count 因为index is an int它会overf
  • 缓存策略,输出缓存与数据缓存或两者兼而有之?

    我正在开发一个 ASP NET MVC 项目 现在我想开始考虑我的缓存策略 我试图让我的框架尽可能开放以供缓存使用 据我在 Scott Hanselman 的播客中听到的消息 StackOverflow com 使用页面输出缓存并压缩该内容
  • Spring Boot 在 Gradle 中获取包的属性

    我正在尝试将我的项目从 Maven 构建转换为 Gradle 目前项目使用Spring Boot 在我当前的 Maven 配置中 我有
  • 如何解决VScode UnsupportedClassVersionError?

    Problem 当我运行 HelloWorld 时 它返回 java lang UnsupportedClassVersionError HelloWorld 已编译 通过更新版本的 Java 运行时 类文件版本 52 65535 该版本的
  • 函数中的自动参数类型

    我想知道标准委员会是否考虑扩展C 14auto关键字来推导函数模板参数类型 就像现在泛型 lambda 中存在的那样 正如这个答案中很好地描述的那样 因为它适用于 lambda 函数 所以它也应该适用于任何函数 当然 这对于经典语法来说是完
  • JavaScript 中的词法范围

    我对 JavaScript 中的作用域到底是如何工作的感到有点困惑 主要是词法作用域 我知道全局作用域中的变量可以在任何地方访问 在 JavaScript 中创建新作用域的唯一方法是通过创建函数 或在 ES6 中使用 let 但是 我不太明
  • Flutter如何手动安装包

    有没有办法手动下载包并安装 使用他们的包管理器真是令人沮丧 这次下载只需要 0 4 秒 但每次尝试多次后都无法下载 每次都要等待几分钟 实在是太不可靠了 至少有办法让我看到进度条之类的吗 我在浏览器中 2 秒就能下载的东西却每次都能成功 下
  • CreateProcess 在 Windows 7 下不会创建额外的控制台窗口?

    我正在尝试使用 CreateProcess 运行一个进程 并在单独的控制台窗口中独立运行它 我可以使用 system 函数来实现这一点 但我更喜欢 CreateProcess 因为它使我可以指定环境和工作目录 获取进程的句柄 以及在需要时通