在Windows系统中,使用chdir()函数在32位程序中改变目录,但是当程序退出时目录不会被改变。在16位的Windows程序中可以改变目录。有人知道如何在32位的Windows程序中实现吗?
嗯……在我看来,这正是操作系统必须保证不会发生的事情之一。当前目录是一个每个进程特有的属性,子进程通常从父进程继承它,但反过来不应该发生(也确实没有发生)。
要获得您想要的结果,父进程可以主动监视某些信息(消息、文件、共享内存等),其中子进程存储新目录,然后使用新值调用chdir()。
据我所知,Windows的cmd.exe没有类似的机制。 实际上,通过在父进程上使用代码注入技术(例如CreateRemoteThread),可能会强制其执行一些意外操作,但这是一种非常肮脏的技巧,既不好用也不普遍。 Win16则是不同的:所有程序都有一个单独的“msdos”状态,但这是一个限制,而不是一个特性。
chdir
系统调用会改变 调用 进程的目录。这意味着按设计,您无法更改其他进程的目录。 - Avindra Goolcharan没错,流行的API调用可以改变进程的目录。但是……
(1.) 16位Windows程序可以更改全局目录;可能是因为它们在与command.com相同的进程中运行。这是我多年来一直使用的方法;我假设XP以某种方式模拟了这一点?……但现在Windows 7 64位不再运行16位程序了!(?)
(2.) Windows和Unix的“cd”命令都可以更改调用进程的目录——这可能是因为它们是命令外壳的内置命令。但是后继的Windows shell也能够完成这个任务,或者至少我希望PowerShell能够做到这一点。所有的内置命令吗?
(3.) 我最终采用的方法是修改我的程序,使其不再调用API,而是向标准输出发出“cd \dst\directory”,然后在一个过程中执行:
chdirprogram >t~.bat
call T~.bat
这非常好用。当然,更改目录程序的常见目的是在批处理程序中提供具有计算目标的功能。在Unix中,您可以使用Bash等变量来实现,但在Windows批处理文件中却不能,虽然在许多后继的Windows过程中可能可以,但我不想使用它们。……由于这个功能显然非常有用,我希望有人知道一个偷偷摸摸的Windows调用可以实现它。说进程更改调用进程的目录是错误的解释只是那些虚假的“你不应该这样做,我不会告诉你为什么”的借口。……但我想我还是要坚持使用我的可怜的小批处理文件。