【问题标题】:How does CreateProcess locate the executable?CreateProcess 如何定位可执行文件?
【发布时间】:2011-04-25 08:55:46
【问题描述】:

根据文档,CreateProcess 可以传递一个可执行文件名 作为第一个参数,或命令行作为第二个参数(从中 可执行文件名将被提取)。

如果您传递一个可执行文件名称,文档中说PATH 将不会被搜索。

如果您改为传递命令行,则提取第一个令牌以供使用 作为可执行文件的名称,应该搜索PATH

不过,就我而言,我对CreateProcess 的调用 --- 仅使用命令行并且 使用修改后的环境--- 找不到所需的可执行文件。它只是 如果我在命令行前面加上cmd.exe /c,则成功(我明白为什么 它是这样工作的)。

为了完整起见,我实际上并没有直接使用 Windows API,而是 subprocess.Popen 在 Python 中,虽然我认为我已经缩小了问题的范围 针对上述情况。使用shell = True,正确的环境是 已接;使用shell = False(我想要的创建子流程的方式), 该调用无法找到我的可执行文件。可执行文件是一个独立的 exe,而不是 cmd.exe 的内在命令。

谁能告诉我我在这里做错了什么或者我的误解在哪里?

示例代码:

from subprocess import Popen
import os, sys

exe = "wc.exe" # No other wc.exe on the PATH
env = os.environ.copy()
new_path = os.path.expandvars(r"%HOMEDRIVE%%HOMEPATH%\SmallApps\GnuWin32\bin;%PATH%")
env["PATH"] = os.path.expandvars(new_path).encode(sys.getfilesystemencoding())

Popen(
     args=[exe, "*.*"],
     env=env,
     # shell=True # Works if you uncomment this line.
)

【问题讨论】:

  • 由于 CreateProcess 和 cmd /c 都对您传递给它们的特定字节高度敏感,如果您包含用于尝试启动此进程的确切字符串,这可能会有所帮助。
  • 添加了与实际代码类似的示例代码。

标签: python winapi subprocess


【解决方案1】:

如果你想让CreateProcess看到它,你需要修改当前进程的环境。目前,子shell(无论是包含在命令行中还是通过shell=True请求)正在查看您修改后的环境,但CreateProcess的直接调用不是。

【讨论】:

【解决方案2】:

如果我没看错你的问题,听起来你在%HOMEDRIVE%%HOMEPATH%\SmallApps\GnuWin32\bin 映射到的文件夹中有一个名为wc.exe 的应用程序。如果是这种情况,最好将 exe 设置为 %HOMEDRIVE%%HOMEPATH%\SmallApps\GnuWin32\bin\wc.exe 的扩展版本。由于此路径和可执行文件名称最终可能包含空格,因此也可以将其用引号括起来。

简而言之,不要依赖路径搜索。它不仅容易出错,而且还是一个潜在的安全漏洞。

【讨论】:

    【解决方案3】:

    想查看 MSDN 吗? CreateProcess 文档。

    引用其中的一部分:

    加载应用程序的目录。 父进程的当前目录。 32 位 Windows 系统目录。使用 GetSystemDirectory 函数获取该目录的路径。 16 位 Windows 系统目录。没有获取这个目录的路径的函数,但是被搜索了。这个目录的名字是 System. Windows 目录。使用 GetWindowsDirectory 函数获取该目录的路径。 PATH 环境变量中列出的目录。请注意,此函数不会搜索 App Paths 注册表项指定的每个应用程序路径。要在搜索序列中包含此每个应用程序的路径,请使用 ShellExecute 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2019-03-31
      • 2016-04-19
      • 2011-01-20
      • 2017-07-10
      • 2021-08-23
      相关资源
      最近更新 更多