chdir编程

Windows中 – 也许是Unix – 在(32位)程序使用chdir()函数在程序退出时不会改变目录。 (它在一个16位Windows程序中。)
有人知道如何在Windows 32位程序中做到这一点?

呃…恕我直言,这正是操作系统必须保证不发生的事情之一。 当前的dir是一个per-process属性,一个子进程通常从父进程继承它,但是反过来不应该发生(而且不会)。 为了获得你想要的东西,一般来说,父母应该主动地观察子进程存储新目录的一些信息(消息,文件,共享内存…),然后用新值调用chdir()。 据我所知,Windows的cmd.exe没有这样的机制。 实际上,通过在父进程上使用代码注入技术(例如CreateRemoteThread),可以迫使它做出一些意想不到的事情,但这是一个非常肮脏的伎俩,一点也不好。 Win16是不同的:所有程序都有一个“msdos”状态,但这是一个限制,而不是一个功能。

这听起来像你问一个进程(你的Win32程序)来改变另一个进程(你的shell)的CWD。 据我所知,如果没有后一种方法为此目的提供API,这是不可能的。 最近的我可以得到任何这种断言的参考,但是, 从MSDN下面的引用:

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

那么是的,这是真正的流行的API调用改变目录改变它的过程。 但是…

(1.)16位的windows程序可以改变全局目录; 可能是因为它们和command.com一样运行。 这就是我多年来一直乐于使用的东西。 我认为XP以某种方式模拟这个? …但现在Windows 7 64位将不再运行 16位程序! (?)

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

(3)我已经完成的方式是修改我的程序,用来调用API简单地发出“cd \ dst \目录”到标准输出,然后在一个过程中

chdirprogram> t〜.bat

调用T〜.bat

这很好。 当然,更改目录程序的通常要点是在批处理过程中提供计算目的地的功能。 当然,你可以在Unix中使用Bash等变量,但不能在Windows批处理文件中,虽然也许(?)在许多后继Windows程序的东西,我不想使用。 …由于这个功能显然是有用的,我希望有人知道一个偷偷摸摸的Windows电话是怎么做的。 一个程序改变一个调用进程的目录是错误的解释是这样的一个假“你不应该这样做,我不会告诉你为什么”的借口。 …但我想我会坚持我可怜的小批量文件。

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