2011-09-17 3 views
7

私は初心者なので非常に基本的な質問かもしれません。私はDirectX 11を起動しています。最初のアプリケーションを作成する際に、wWinMainが使用され、WinMainとwWinMainの違いを検索しながら、このパラメータprevInstanceを調べました。いつもprevInstanceがWinMainにあり、wWinMainが常にNULLの場合

前のインスタンスは常にMSDNによってnullであり、常にnullであるため、存在しないのはなぜですか(クリエイターが役に立たないパラメータを与えていないと考えるのは論理的です)。そして、(本から引用)、

あなたが アプリケーションの前のインスタンスがすでに実行されているかどうかを確認する方法が必要な場合は、ドキュメントがCreateMutexを使用して 一意の名前のミューテックスを作成することをお薦めします。 mutexは になりますが、CreateMutex関数はERROR_ALREADY_EXISTSを返します。

ミューテックスとはどのようなもので、どのように使用すればよいですか(良いリンクで十分でしょう)。そして、アプリケーションの別のインスタンスが存在するかどうかを調べるメソッドが必要なように見えます。prevInstanceには、nullなので、明らかにそうでないポインタや参照があるはずです。なぜそうであり、prevInstanceの役割は何ですか?

+4

ちょうど*が*常にnullであるという意味ではなく、*常にnull ... – quasiverse

答えて

15

Raymond Chen's blogは、今日私たちにとって「奇妙な」Windows APIの側面について議論することにほぼ全面的に専念しています。そして、幸いにも、彼はこの正確な質問に答えるblog postを持っています。

16ビットWindowsでは、GetInstanceDataという機能がありました。この 関数は、HINSTANCE、ポインタ、および長さを取り、そのインスタンスから現在のインスタンスにコピーされたメモリ をコピーしました。 ( 第二及び第三のパラメータが同じでなければならなかったという制限を有する、ReadProcessMemoryに16ビットの同等のそれの一種。)

...

これはにhPrevInstanceパラメータの理由でしたWinMain。 hPrevInstanceがNULLでない場合は、すでに実行中のプログラムのコピー のインスタンスハンドルでした。 GetInstanceDataを使用して のデータをコピーして、地面から速く立ち上がることができます。たとえば、 の場合、以前の インスタンスからメインウィンドウハンドルをコピーして、通信できるようにすることができます。

hPrevInstanceがNULLであったかどうかは、プログラムの最初のコピーである であったかどうかを示していません。 16ビットWindowsでは、プログラムの最初の インスタンスのみがそのクラスを登録しました。 2番目以降の インスタンスは、最初のインスタンス によって登録されたクラスを引き続き使用していました。 hPrevInstanceが であれば、すべての16ビットWindowsのWindows プログラムはクラス登録をスキップしました(実際には試してみると、登録は失敗しました)。

WinMainを移植する時間が来たときに、Win32を設計した人が少し修正しました:hPrevInstanceに渡すものは?結局のところ、 モジュール/インスタンスのすべてがWin32に存在せず、 という別々のアドレス空間は、2番目のインスタンスで の再初期化をスキップしたプログラムがもう機能しなくなることを意味していました。したがって、Win32 は常にNULLを渡し、すべてのプログラムが最初に と信じています。もちろん

、今hPrevInstanceは互換性の理由を除き、今日のWindows APIとは無関係であることを、MSDNは、アプリケーションの以前のインスタンスを検出するために、ミューテックスを使用することをお勧めします。

mutexは、「相互排除」を表します。 CreateMutex()については、the MSDN documentationを参照してください。 mutexを使用してアプリケーションの前のインスタンスを検出する例はたくさんあります。such as this one基本的なアイデアは、思いついた一意の名前のミューテックスを作成し、そのミューテックスを作成しようとします。 CreateMutex()ERROR_ALREADY_EXISTSで失敗した場合は、アプリケーションのインスタンスが既に起動していることがわかります。

+4

私はあなたの答えが単なるリンク以上になるように、ブログ投稿を要約する自由を取った。 –

+0

@ジョン・パーディー:私は編集を感謝しますが、私は文脈を失わないように、チェン氏の全体の説明を引用している途中です。 :-) –

+2

よくうまくいっています。たぶん、SOには、現在編集中の回答の指標があるはずです。 –

1

prevインスタンスパラメータは、16ビットWindowsとの互換性のために存在します。私はそれがWinMainのMSDNのリファレンスに書かれていると思います。

関連する問題