3

In Windows -- and probably Unix for that matter -- using the chdir() function in a (32-bit) program doesn't change the directory when the program exits. (It does in a 16-bit Windows program.)
Does anybody know how to do that in a Windows 32-bit program?

4

4 回答 4

7

嗯...恕我直言,这正是操作系统必须保证不会发生的事情之一。当前目录是每个进程的属性,子进程通常从父进程继承它,但不应该发生相反的情况(它不会)。

为了获得你想要的东西,父进程可以主动观察子进程存储新目录的一些信息(消息、文件、共享内存……),然后用新值调用chdir()。

据我所知,Windows 的 cmd.exe 没有这样的机制。实际上,通过在父进程上使用代码注入技术(例如 CreateRemoteThread),可以强制它做一些意想不到的事情,但这是一个非常肮脏的技巧,既不好也不一般。Win16 不同:所有程序都有一个“msdos”状态,但这是一个限制,而不是一个特性。

于 2010-03-12T18:45:00.213 回答
3

听起来您要求一个进程(您的 Win32 程序)更改另一个进程(您的 shell)的 CWD。据我所知,如果没有后一个进程为此目的提供 API,这是不可能的。然而,对于这个断言,我最接近的任何参考是MSDN的以下引用:

父进程可以在进程创建过程中直接改变子进程的环境变量。这是一个进程可以直接更改另一个进程的环境设置的唯一情况。

于 2010-03-12T18:41:00.687 回答
2

嗯,是的,流行的 API 调用更改目录确实会为该过程更改它。... 但 ...

(1.) 16位windows程序可以更改全局目录;可能是因为它们与 command.com 在同一进程中运行。这就是我多年来一直在愉快地使用的东西;我假设 XP 以某种方式模拟了这一点?...但是现在 Windows 7 64 位将不再运行16 位程序!(?)

(2.) Windows 和 Unix 的“cd”命令当然都可以更改调用进程的目录——大概是因为它们是命令 shell 的内置命令。但是后续的 Windows shell 能够做到这一点,或者至少我希望PowerShell 能够做到这一点。所有内置插件?

(3.) 我完成它的方式是修改我的程序,这些程序用于调用 API 以简单地将“cd \dst\directory”发送到标准输出,然后在一个过程中执行

chdirprogram >t~.bat

调用T~.bat

效果很好。当然,更改目录程序的通常要点是在批处理过程中提供具有计算目标的功能。当然,您可以在 Unix 中使用 Bash 等变量执行哪个操作,但不能在 Windows 批处理文件中执行,尽管可能(?)在众多后续 Windows 程序中,我不想使用。...由于此功能显然是很有用,我希望有人知道偷偷摸摸的 Windows 调用它会做什么。进程更改调用进程的目录在某种程度上是错误的解释是那些虚假的解释之一,“你不应该这样做,我不会告诉你为什么”的借口。...但我想我会坚持我可怜的小批处理文件。

于 2010-03-15T16:24:04.293 回答
0

您是在谈论Windows API的SetCurrentDirectory函数吗?文章说该功能“更改当前进程的当前目录”。例如在 Delphi 中,有一个函数 ChDir 实际调用了这个 API 函数。

于 2010-03-12T18:41:30.750 回答