2011年12月25日

同じ名前の同期オブジェクトを再生成したら、再オープンが必要

Windows の上でプロセス間通信をするときの1つの手段として、メールスロットという同期オブジェクトがあります。 送信側のプロセスからメールスロットにバイナリ・データをライトすると、受信側のプロセスからリードすることができます。

送信側と受信側を結びつけるのは、メールスロットに付けられた名前です。 受信側が最初に呼び出す CreateMailSlot 関数の引数に、名前を指定します。 送信側は、CreateFile 関数の引数に、名前を指定します。 このとき、CreateFile 関数の引数に OPEN_EXISTING を指定するため、open file の意味になり、すでにあるメールスロットを開くことになります。

送信側の CreateFile を呼び出すタイミングが、受信側の CreateMailSlot を呼び出す前、つまりメールスロットが存在していないときは、エラーになります。 これは、当然といえば当然なのですが、送信側のプロセスと受信側のプロセスのタイミングを合わせなければ、エラーになってしまうため、取り扱いが難しいです。 必要なら再試行する(ポーリングする)コードを記述する必要があります。

受信側で CreateMailSlot から得られたメールスロットのハンドルを使って、受信側で CloseHandle を呼び出すと、メールスロットが無くなります。 この状態で、送信側が CreateFile を呼び出すとエラーになるのはもちろん、すでに CreateFile に成功して取得したメールスロットのハンドルを使ってライトすると、エラーになります。

送信側ですでに CreateFile に成功して取得したメールスロットのハンドルは、受信側で CloseHandle した後、再度 CreateMailSlot を呼び出して同じ名前のメールスロットを作成した後でも、使うことはできません。 同じ名前でも違うメールスロットができているようです。 送信側で再度 CreateFile してメールスロットのハンドルを取得し直す必要があります。

sage_p at 22:58│Comments(2)TrackBack(0)プログラミング 

トラックバックURL

この記事へのコメント

1. Posted by ITCBET.com Website Taruhan Lengkap dan Terpercaya   2013年08月20日 19:38
5 ITCBET.com Website Taruhan Lengkap dan Terpercaya ですでに CreateFile に成功して取得したメールスロットのハンドルは、受信側で CloseHandle した後、再度 CreateMailSlot を呼び出して同じ名前のメールスロットを作成した後でも、使うことはできません。 同じ名前でも違うメールスロットができているようです。
2. Posted by 828BET.COM AGEN BOLA TERPERCAYA PIALA DUNIA 2014   2013年08月20日 19:39
5 828BET.COM AGEN BOLA TERPERCAYA PIALA DUNIA 2014 で CreateMailSlot から得られたメールスロットのハンドルを使って、受信側で CloseHandle を呼び出すと、メールスロットが無くなります。 この状態で、送信側が CreateFile を呼び出すとエラーになるのはもちろん、すでに CreateFile に成功して取得したメールスロットのハンドルを使ってライトすると、エラーになります。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔