3

Windows(そしておそらくUnix)では、(32ビット)プログラムでchdir()関数を使用しても、プログラムの終了時にディレクトリは変更されません。(16ビットのWindowsプログラムで実行されます。)
Windowsの32ビットプログラムでそれを実行する方法を知っている人はいますか?

4

4 に答える 4

7

うーん...私見それはOSが起こらないことを保証しなければならないことの1つです。現在のディレクトリはプロセスごとのプロパティであり、子プロセスは通常、親プロセスから継承しますが、その逆は発生しないはずです(発生しません)。

必要なものを取得するために、親は子プロセスが新しいディレクトリを格納する情報(メッセージ、ファイル、共有メモリなど)をアクティブに監視し、新しい値でchdir()を呼び出すことができます。

私の知る限り、Windowsのcmd.exeにはそのようなメカニズムはありません。実際、親プロセスでコードインジェクション手法(CreateRemoteThreadなど)を使用することで、予期しないことを強制することができますが、これは非常に汚いトリックであり、一般的でもありません。Win16は異なっていました。すべてのプログラムに単一の「msdos」状態がありましたが、それは制限であり、機能ではありませんでした。

于 2010-03-12T18:45:00.213 に答える
3

あるプロセス(Win32プログラム)に別のプロセス(シェル)の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" コマンドは、もちろん、呼び出しプロセスのディレクトリを変更できます。これは、コマンド シェルの組み込みコマンドであるためと考えられます。しかし、後継の Windows シェルはこれを実現することができます。少なくとも、PowerShell がそれを実現できることを願っています。すべてビルトイン?

(3.)私がそれをやった方法は、APIを呼び出して「cd \ dst \ directory」をstdoutに出力するために使用したプログラムを変更してから、手順で実行することです

chdirprogram >t~.bat

T~.bat を呼び出す

これはうまくいきます。そしてもちろん、ディレクトリ変更プログラムの通常のポイントは、計算された宛先を持つバッチ プロシージャの機能を提供することです。もちろん、Bashなどの変数を使用してUnixで実行できますが、Windowsバッチファイルでは実行できません。... この機能は明らかに便利なので、だれかが Windows の卑劣な呼び出しを知っていることを期待していました。プロセスが呼び出しプロセスのディレクトリを変更するのはどういうわけか間違っているという説明は、「あなたはそれをするべきではなく、理由は教えません」という偽りの言い訳の 1 つです。...しかし、私は哀れな小さなバッチファイルに固執するつもりです。

于 2010-03-15T16:24:04.293 に答える
0

あなたはWindowsAPIのSetCurrentDirectory関数について話しているのですか?この記事によると、この関数は「現在のプロセスの現在のディレクトリを変更する」とのことです。たとえばDelphiには、このAPI関数を実際に呼び出す関数ChDirがあります。

于 2010-03-12T18:41:30.750 に答える