0

継承した foxpro (~shudder~) で書かれたプログラムがあります。

問題は、いくつかの COM コントロールが含まれていることです。2 つのコピーを開始すると、2 番目のコピーでエラーがスローされます。そこで、これをクリーンアップして、アクティブ コピーを前面に移動し、単一のインスタンスのみを許可できると考えました。

それは問題ありませんが、プログラムは別のモードで実行できるようにするコマンド ライン パラメーターを受け取ります。各モードで実行できるコピーは 1 つだけです。

1)

"program /bos"   
"program /pos"  = OK

2)

"program /pos"
"program /pos"  = NOT OK

私が欲しいのはこれです

"program /pos"
"program /pos" - Bring currently running pos instance to the front.

"program /bos" - start a BOS instance.
"program /bos" - bring the bos instance to the front.

それが理にかなっていることを願っています。プログラムの実行中のインスタンスが pos または bos モードのどちらであるかを判断するためのエレガントな方法は何ですか。これにより、どのプロセスを前面に出すか、または要求されたモードで新しいコピーを開始するかを判断できます。

ここで必ずしも foxpro コードが必要というわけではありませんが、それはいいことですが。コンセプトは私が求めているものであり、それを達成するための Windows API 関数に関するいくつかのヒントも役立ちます。たとえば、実行中のプロセスのコマンド ライン オプションを特定できますか?

4

3 に答える 3

1

名前付きミューテックスは、必要なことを正確に実行します。ただし、すべての可視プロセスのコマンド ラインを表示する必要があり、Windows XP 以降を対象としている場合は、WMI を使用できます。WIN32_Processには、XP / Server 2003 で導入された CommandLine プロパティがあります。

于 2009-11-17T10:39:25.747 に答える
0

自分以外のプロセスのコマンドラインを取得できるとは思いません。

これを行う一般的な方法は、名前付きミューテックスを使用することです。プログラムが起動すると、ミューテックスが取得されます。起動できない場合は、別のインスタンスがすでに実行されています。

2つの名前付きミューテックスを使用できなかった理由はありません。1つは/posモード用、もう1つはモード用/bosです。

于 2009-11-16T20:38:37.320 に答える
0

GetCommandLineは、コマンドライン引数を返します。次に、名前付きミューテックスを一意の識別子として使用して、プロセスがすでに実行されているかどうかを判断します。ミューテックス名の一部としてコマンドライン引数(または探している特定の部分)を含めると、探している動作を取得できます。

于 2009-11-16T20:39:55.740 に答える