【问题标题】:WinAPI: find directory of own executeable when location is changedWinAPI:在位置更改时查找自己可执行的目录
【发布时间】:2013-11-24 15:18:59
【问题描述】:

我想创建一个 C++ 程序来不断检查可执行文件的位置和移动 如果不存在,则将其移至定义的位置。

这适用于一次性运行。

但是我的问题是,当我运行可执行文件并将 GetModuleFileName 放在循环中时, 并将可执行文件移动到不同的位置,GetModuleFileName 不会返回 新位置,我希望它返回它,我对 WinAPI 非常陌生,几乎不了解基础知识,所以请不要开始抨击我或其他什么...

【问题讨论】:

  • 我不确定这是否可行。您可以检查您的可执行文件是否位于所需的目录中,但将其移回...我不是专家,但我认为用户模式功能禁止此类操作。
  • 如果你移动正在运行的可执行文件,你并没有移动当前的可执行文件——从你的进程的角度来看,你只是将一些文件移动到某个位置(我不知道这是否可能,正如 Petro 指出的那样,- 你可以移动当前在内存中的文件吗?)。
  • 可执行文件被加载到内存中。它只“记住”它是从哪里运行的。
  • 你想解决什么问题?
  • 如果程序可以确定可执行文件的移动时间和位置,这将是可能的。移动的事实很容易检测到。同样正如@DavidHeffernan 指出的那样,考虑提供更多有问题的细节。另外,我有一种奇怪的感觉,你是初学者恶意软件..

标签: c++ winapi getmodulefilename


【解决方案1】:

GetModuleFileName 返回已加载模块的位置。返回的值在模块的生命周期内保持不变。

您要问的是非sequer。文件和模块是不同的。你加载一个模块,然后你就有一个模块。如果您将该文件复制到其他位置,则该文件与模块无关。更重要的是,当一个模块被加载时,文件被锁定。所以你不能删除加载了正在运行的模块的文件。

坦率地说,既然你承认自己是 Win32 的新手,我认为你应该重新考虑你为真正的问题选择的解决方案。您选择的课程不太可能真的是正确的解决方案。

【讨论】:

    【解决方案2】:

    当您的程序加载时,调用GetModuleFileName() 以确定用于启动调用进程的文件的位置。如果不在需要的地方,移动文件,然后调用CreateProcess()将移动的文件作为新进程执行,然后退出当前进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多