chdir以编程方式

时间:2010-03-12 18:24:32

标签: windows chdir

在Windows中 - 可能是Unix - 在(32位)程序中使用chdir()函数在程序退出时不会更改目录。 (它在16位Windows程序中。)
有人知道如何在Windows 32位程序中执行此操作吗?

4 个答案:

答案 0 :(得分:6)

嗯......恕我直言,这正是操作系统必须保证不会发生的事情之一。当前目录是一个每进程属性,子进程通常从父进程继承它,但反过来不应该发生(并且它不会发生)。为了获得您想要的内容,通常,父级应该主动监视子进程存储新目录的一些信息(消息,文件,共享内存...),然后使用新值调用chdir()。据我所知,Windows的cmd.exe没有任何类似的机制。 实际上,通过在父进程上使用代码注入tecniques(例如CreateRemoteThread),可以强制它做出意想不到的事情,但这是一个非常肮脏的技巧,一般都不是好事。 Win16是不同的:所有程序都有一个“msdos”状态,但它是一个限制,而不是一个功能。

答案 1 :(得分:3)

听起来你要求一个进程(你的Win32程序)改变另一个进程(你的shell)的CWD。据我所知,如果没有后一个过程为此目的提供API,这是不可能的。最近的我可以得到这个断言的任何类型的引用,但是,引用如下from MSDN

  

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

答案 2 :(得分: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”发送到stdout,然后在程序中执行

chdirprogram> t~.bat

调用T~.bat

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

答案 3 :(得分:0)

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