在Windows (可能还有Unix )中,在程序退出时,使用(32位)程序中的chdir()函数不会改变目录。(在一个16位的Windows程序中是这样的。)
有人知道如何在Windows 32位程序中这样做吗?
发布于 2010-03-12 18:45:00
嗯..。这正是操作系统必须保证而不是发生的事情之一。当前dir是一个每个进程的属性,子进程通常从父进程继承它,但是不应该发生相反的情况(而不是)。
为了获得您想要的,父程序可以主动地查看一些信息(消息、文件、共享内存.)其中,子进程存储新目录,然后使用新值调用chdir()。
据我所知,Windows的cmd.exe没有任何这样的机制。实际上,通过在父进程上使用代码注入技术(例如CreateRemoteThread),可以强迫它做一些意想不到的事情,但这是一个非常肮脏的伎俩,一点也不好,也不一般。Win16是不同的:所有的程序都有一个单一的"msdos“状态,但它是一个限制,而不是一个特性。
发布于 2010-03-12 18:41:00
听起来,您在要求一个进程(您的Win32程序)更改另一个进程(您的shell)的CWD。据我所知,如果没有后一个过程为此目的提供一个API,这是不可能的。然而,对于这个断言,我能找到的最接近的引用是下面的引语来自MSDN
父进程可以在进程创建期间直接更改子进程的环境变量。这是进程可以直接更改另一个进程的环境设置的唯一情况。
发布于 2010-03-15 16:24:04
是的,是的,流行的API调用可以改变目录,为进程更改目录。..。但是..。
(1)16位windows程序可以更改全局目录;可能是因为它们运行在与command.com程序相同的进程中。这就是我多年来一直在愉快地使用的东西;我认为XP在某种程度上模仿了这一点?但是现在Windows 7 64位不再运行16位程序了!(?)
(2.)当然,Windows和Unix "cd“命令都可以更改调用进程的目录--大概是因为它们是内置命令shell。但是后继的Windows设法做到了这一点,或者至少我希望PowerShell能够做到这一点。都是内置的?
(3.)我的结束方式是修改我以前调用API的程序,将"cd \dst\目录“发出到stdout,然后在一个过程中执行
>t~.bat程序>t~.bat
调用T~.bat
效果很好。当然,更改目录程序的通常要点是在批处理过程中提供一个计算的目标的功能。当然,您可以在Unix中使用Bash等变量,但在Windows批处理文件中不能这样做,尽管可能(?)在众多后继Windows程序的事情,我不想使用。..。由于这个功能显然是有用的,所以我希望有人知道Windows调用会做什么。对于进程更改调用进程目录的解释是错误的,这是一种虚假的解释,“您不应该这样做,我也不会告诉您为什么”。..。但我想我还是坚持我那可怜的批处理文件吧。
https://stackoverflow.com/questions/2434872
复制相似问题