【问题标题】:reg.exe stays on process list after executing by WinExec()reg.exe 被 WinExec() 执行后保留在进程列表中
【发布时间】:2013-11-26 15:23:37
【问题描述】:

我有一个类似的问题: Using Java runtime to add registry key, cause process reg.exe to run forever

但我使用的是 C++ 和 WinExec(),但我不知道如何在我的代码中使用为 Java 提供的解决方案。

我的代码是:

int result = 
WinExec("CMD.EXE /C REG ADD HKEY_LOCAL_MACHINE\... /v Data1 /t Reg_SZ 
    /d \"cmd.exe /C ...\"", SW_HIDE);

我已尝试将其更改为:

int result = 
WinExec("CMD.EXE /C REG ADD HKEY_LOCAL_MACHINE\... /v Data1 /t Reg_SZ 
    /d \"cmd.exe /C ...\" > 0", SW_HIDE);

但它给了我同样的结果。

那么如何“消耗”进程的输出并以正确的方式关闭所有流?我猜 CMD.EXE 在执行后也会保持活动状态(0% CPU,egists 永远)。

【问题讨论】:

  • REG ADD 要求您授予覆盖现有值的权限。你永远不会回答这个问题,所以它会永远等待。既然您已经在编写 C++,为什么不自己调用 RegSetValueEx 呢?
  • 尝试手动运行整个命令字符串?可能是 reg 正坐在提示符处等待输入或其他什么。
  • 确实,reg 是一个提示符。谢谢你们:)

标签: c++ windows io registry iostream


【解决方案1】:

根据我帖子下的 cmets,我检查了 reg.exe 是否正在提示,这就是重点!

我为REG 添加了/f 选项以静默确认:

int result = 
WinExec("CMD.EXE /C REG ADD HKEY_LOCAL_MACHINE\... /v Data1 /t Reg_SZ /f
    /d \"cmd.exe /C ...\"", SW_HIDE);

谢谢 Marc BRaymond Chen :)

我正在使用包含 WinExec("...") 的大约 1k 行的现有代码,所以我真的不想将它们全部重写为 RegSetValueEx 和其他代码(不仅REG 是这样调用的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多