【问题标题】:GetTempPath returns different path in different processGetTempPath 在不同的进程中返回不同的路径
【发布时间】:2018-06-13 08:12:04
【问题描述】:

GetTempPath 在我的 Windows 10 应用程序 A 中返回 C:\Users\sam\AppData\Local\Temp\

但它在同一台计算机上的另一个应用程序 B 中返回 C:\Users\sam\AppData\Local\Temp\2\(另一个应用程序中的 dll 打印 GetTempPath 的值)。我猜应用程序 B 更改了临时路径。

boost 文件系统的行为相同。

auto tempDirPath = boost::filesystem::temp_directory_path();
return tempDirPath.native();

这是怎么发生的?我怎样才能得到完全相同的临时路径C:\Users\sam\AppData\Local\Temp\

【问题讨论】:

  • 这与windows API无关。接缝是嘘声的问题。您是否研究过 boost 的实现?
  • @xMRi GetTempPath 和 boost 的行为相同。

标签: winapi visual-c++ boost


【解决方案1】:

GetTempPath API 确定为临时文件指定的目录路径的方式已记录在案:

GetTempPath 函数按以下顺序检查环境变量是否存在,并使用找到的第一个路径:

  1. TMP 环境变量指定的路径。
  2. TEMP 环境变量指定的路径。
  3. USERPROFILE 环境变量指定的路径。
  4. Windows 目录。

如果从不同进程对该 API 的 2 次调用返回不同的结果,则这些进程具有不同的环境。默认情况下,进程从其父进程继承环境,但CreateProcess 允许您显式指定环境块。同样,SetEnvironmentVariable 可用于更改调用进程中的环境变量。

您可以使用Process Explorer 之类的工具来检查任何给定进程的环境。

【讨论】:

  • 你是对的。您是否知道一种在系统设置环境中获取该设置的方法(应用程序无法影响)?
  • @user1633272:我不知道有一个 API 可以让您检查系统全局环境设置。您可能不得不从注册表中解析这些内容,尽管这听起来像是XY Problem。你真正想要完成什么?为什么重要,您从GetTempPath 获得什么价值?
  • 向目标应用程序注入的 dll,我的应用程序需要协商导出文件/读取文件的路径。目前我正在使用临时路径来构建文件路径,但临时路径被我的一台客户端计算机上的目标应用程序更改。
  • @user1633272:如果这些进程需要就某个位置达成一致,它们应该相互通信该位置(管道、共享内存等)。依赖于你无法控制的状态不会可靠地工作。
  • 我最初的想法是使用临时路径下的进程ID构造的文件名。通信机制应该可以工作,只是看起来有点矫枉过正。我将尝试从注册表中读取值或通过用户名构造它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多