2

Windows XP SP3 で動作する MFC アプリケーションに取り組んでいます。要件の 1 つは、ユーザーがアプリケーションにログインするときに、アプリケーションがそのユーザーの資格情報を使用して組み込み Linux サーバーでホストされている複数の SMB 共有をマウントする必要があることです。

このプログラムには「ユーザーの切り替え」機能があり、アプリケーションを閉じずに別のユーザーがログインできるため、最初のユーザーのセッションが終了します。その場合、SMB 共有をアンマウントしてから、新しいユーザーとして再マウントする必要があります。

これを行うには、呼び出しのWNetCancelConnection2直後にを呼び出しWNetAddConnection2ます。 WNetCancelConnection2を返しNO_ERROR、成功したことを示します。 ただし、WNetAddConnection2新しいユーザーとしてドライブを再マウントできない場合があります。 を使用FormatMessageして戻り値からエラー文字列を取得すると、WNetCancelConnection2成功したように見えても、次のエラー メッセージが表示されます。

複数のユーザー名を使用して、同じユーザーがサーバーまたは共有リソースに複数接続することは許可されていません。サーバーまたは共有リソースへの以前の接続をすべて切断して、再試行してください。

コマンド プロンプトから実行net useしても、SMB 共有への開いている接続は表示されません。

ユーザーがマウントされたドライブと対話しない場合、この障害は発生しません。ユーザーが何らかの方法でマウントされたドライブにアクセスした場合、つまり、ユーザーがマウントされたドライブを Windows Explorer で開いた場合にのみ発生します。 同様に、アプリケーションを完全に終了してから再起動し、別のユーザーとしてログインしても発生しません。

WNetCancelConnection2これらすべてから、ネットワーク リソースへのすべての開いているハンドルが閉じられる前に戻るという競合状態があると私は信じています。私の質問は、これらのハンドルがすべて閉じられるまでプログラムをブロックしたり、呼び出し後に待機したりして、この方法で失敗しないことを保証することはできますか? WNetCancelConnection2WNetAddConnection2 ブロッキング API または接続が完全に閉じられるのをビジー待機する方法のいずれかが許容されます。どちらかが望ましいでしょうsleep()し、最善を願っています。:-)

4

0 に答える 0