![重命名程序或其工作目录会改变行为吗?](https://linux22.com/image/1517771/%E9%87%8D%E5%91%BD%E5%90%8D%E7%A8%8B%E5%BA%8F%E6%88%96%E5%85%B6%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95%E4%BC%9A%E6%94%B9%E5%8F%98%E8%A1%8C%E4%B8%BA%E5%90%97%EF%BC%9F.png)
这绝对是我很长时间以来遇到的最奇怪的错误……
我在 Windows 10 上有一个非常简单的 .exe,是我自己使用 MSVC 和 Allegro 库(使用 DirectX)编译的。源代码如下,以防细节很重要,但要点是:
- 当我运行代码时,DirectDraw 会引发运行时错误。
- 如果我重命名可执行文件,错误就会消失并且程序可以成功运行。
- 如果我将可执行文件移动到不同的文件夹,或者重命名该文件夹,则程序将成功运行。
- 如果我将可执行文件/文件夹重命名为原来的名称,错误就会再次出现。
文件夹中没有其他文件。我唯一能想到的是 Windows 正在以某种方式查找绝对路径可执行文件并根据该值表现不同(缓存一些兼容性信息?)
知道发生了什么吗?实际上,我可以简单地重命名可执行文件并继续我的一天,但现在我真的很好奇为什么会发生这种行为......
PS:代码如下,使用Allegro 4.4库。
#include "allegro.h"
int main(int argc, char **argv)
{
allegro_init();
set_color_depth(8);
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0);
exit(0);
}
END_OF_MAIN()
当我运行代码时,尝试设置视频模式时出现错误(E_NOIMPL)。
答案1
您应该知道,Windows 将程序的完整路径存储在注册表或桌面中。如果您重新排列程序的名称或目录,则需要在注册表中搜索程序的名称。
值得一看的一个地方是 APPPATHS,您可以在其中创建所需程序的快捷方式。您可以复制 write.exe,并将其中的字符串 (wordpad.exe) 替换为不再使用的名称 (例如 zdirectx.exe),并在 apppath 注册表中创建一个条目,directx.exe
当您调用时它将启动zdirectx.exe
。然后您也可以调用您的程序directx.exe
。
我使用这种技术将许多程序内容移出路径,同时仍保持程序可访问。