2011-06-13 17 views
2

私たちは、現在のexe名を変更して更新したバージョンを同じフォルダに置きます。これにはいくつかの大きな利点があり、プログラムが次に実行されるときに、更新されたバージョンが呼び出されます。プロセスが開始されてからexe名が変更されたかどうかを検出するにはどうすればいいですか?

このように言えば、実行中のプロセスが正しい名前のexeにリンクされているかどうかを確認したり、アップデートが行われたかどうかを確認することもできます。

これを特定する方法を知っている人はいますか?

ありがとうございます。

+2

実行ファイルを更新していることがわかっている場合、更新されていることがわかります。プロセス外の場合は、定期的にバージョン番号(1時間ごと)を確認し、通知領域のアイコンで通知してください。 –

答えて

3

FILE_NOTIFY_CHANGE_FILE_NAMEフィルタでFindFirstChangeNotification API(MSDNを参照)を使用して変更通知オブジェクトを設定する必要があると思います。その後、通知を受け取ったら、あなたのexeについて確認し、適切な処置をとってください。 このAPIをラップするコンポーネントがあります。つまり、JVCLがインストールされている場合は、それが1つあると確信しています。

0

プロセスが実行中の場合、その実行可能ファイルAFAIKの名前を変更することはできません。だから私はあなたの質問のポイントを得ることはありません。

実行中のexeバージョンを確認するには、GetVersion APIを使用してバージョン番号を取得します。

+0

'IMAGE_FILE_NET_RUN_FROM_SWAP' PEイメージフラグを設定した場合、ファイルの名前を変更できます。気をつけて実行中の実行可能ファイルの名前を変更することもできますが、削除することはできません。 –

+0

私は更新のサイクル全体の原則であるように、名前を変更することができ、夢のように機能します。 – Reallyethical

+0

@allあなたは正しい:私はそれが私にはあまりにも奇妙に聞こえたので、私はそれをテストしなかった... –

0

GetCurrentProcessId()を使用して、OpenProcess()に渡すPIDを取得できます。 GetModuleFileNameEx()を使用して、場所の完全修飾パスを取得できます。私はあなたが現在のexeファイルが最新のものかどうかを判断するのに使うことができるファイル階層/命名規則のいくつかの並べ替えを持っていると思います。 PathStripPath()は便利かもしれませんし、他のものの一部はpath functionsかもしれません。

+0

私は必ずしもこれが助けになるとは思わないが、GetCurrentProcessId、OpenProcessそして最後にGetModuleFileNameExはモジュールを得るためにファイル名。 GetModuleFileNameを呼び出し、HMODULEとしてNULLを渡すだけです。 –

+0

Duhhh瞬間:)あなたは正しいです。私はあまりにも他のプロセスに属するモジュールでその関数を使うのに慣れています。 –

+1

私はGetModuleFileNameと他の "プロセス情報ルーチン"がこの場合にうまくいくかどうかはわかりません - 私はそれらが更新されたファイル名ではなく元のファイル名を返すことを期待しています。しかし、私はそれをテストしていない... – ain

0

Delphiの簡単な方法は、ParamStr(0)を使用することです。これは、exeファイルのフルパスとファイル名を持ちます。プログラムの開始時にexeファイルのDateTimeStampを格納します。それから、定期的に変更があったかどうかを確認してください...

関連する問題