以前も同じような質問をさせてもらったんですが、
再度質問です。
WNetUseConnectionを使って共有フォルダへアクセスしています。
Vistaでは、
接続していない場合⇒ログイン画面を表示し、ユーザ名とパスを入力する
接続済みの場合⇒そのまま接続
という希望通りの動作をしています。
が、XPの場合、接続済みであっても常にログイン画面が表示されてしまいます。
一度接続すれば、PCをログオフ等しない限り接続が保持されると思うのですが...
以下、コードです。
この辺ご存じの方がいましたらご教授ください。
環境 2003 MFC
// フォルダ接続を一旦解除
DWORD dwCancel = ::WNetCancelConnection2(lpszShareName, 0, FALSE);
DWORD dwInfo = 0;
NETRESOURCE netResource = { 0 };
netResource.dwScope = RESOURCE_GLOBALNET;
netResource.dwType = RESOURCETYPE_DISK;
netResource.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC;
netResource.dwUsage = RESOURCEUSAGE_CONNECTABLE;
netResource.lpLocalName = NULL;
netResource.lpRemoteName = 接続先;
netResource.lpComment = NULL;
netResource.lpProvider = NULL;
// 既定の認証にてネットワーク資源へ接続する
DWORD dwResult = ::WNetUseConnection(
hWnd,
&netResource,
NULL,
NULL,
0,
NULL,
NULL,
&dwInfo
);
switch (dwResult)
{
case NO_ERROR:
//成功
break;
case ERROR_NETWORK_UNREACHABLE: // ネットワークに到達できません。
case ERROR_HOST_UNREACHABLE: // ネットワークに到達できません。
case ERROR_PROTOCOL_UNREACHABLE: // ネットワークに到達できません。
case ERROR_NO_NETWORK: // ネットワークに接続されていません。
//失敗
break;
case ERROR_LOGON_FAILURE:
default:
// 認証ダイアログを表示
dwResult = ::WNetUseConnection(
hWnd,
&netResource,
NULL,
NULL,
CONNECT_INTERACTIVE |
CONNECT_PROMPT,
NULL,
NULL,
&dwInfo
);
switch (dwResult)
{
case NO_ERROR:
//成功
break;
case ERROR_CANCELLED:
//キャンセル
break;
case ERROR_SESSION_CREDENTIAL_CONFLICT:
//二重ログイン
break;
default:
//エラー
break;
}
break;
}
Vista の場合、接続済みでなければ「// 認証ダイアログを表示」とコメントされている
ところのコードへ来る、接続済みならば最初の WNetUseConnection で成功する、XP で
は最初の実行は常に失敗する、ということでよろしいですか?
また、失敗する際のエラーコードは常に ERROR_LOGON_FAILURE ですか?
aetos様
おっしゃる通りの動作です。
XPの場合、一度目のWNetUseConnectionで
常にERROR_LOGON_FAILURE(1326)が返ってきます。
VistaとXPでAPIの動作が違うなんてことがあるのでしょうか?
> VistaとXPでAPIの動作が違うなんてことがあるのでしょうか?
あり得ると思います。
あるいは、何か XP の方がそういう設定になっているのかもしれません。
この辺りを試してみるとか。
http://pnpk.net/cms/archives/320
>この辺りを試してみるとか。
> http://pnpk.net/cms/archives/320
XPで見てみましたが、なにも保存されていませんでした。
でも関係ありそうな感じです。
XPの設定を調べてみます。
>// フォルダ接続を一旦解除
>DWORD dwCancel = ::WNetCancelConnection2(lpszShareName, 0, FALSE);
ここで切ってるのと
>netResource.lpRemoteName = 接続先;
こいつは、同じ場所?
同じ場所です。
すいません、変え忘れました。
すると
いったん切断してから、接続を試みてる
のが原因じゃないのかな?
一旦解除している部分をコメントアウトしてみたらどうでしょうか?
WNetCancelConnection2の第三引数をFALSEにしているため、
実際はここでは切断はしていません。
もともとあったコードなのですが、
あまり意味ない?のかな。消してもいいと思っていますが。。。
やはりOSの設定(仕様?)なのかもしれません。
もう少し調べてみて、情報がなければ
このままで行こうと思います。
> いったん切断してから、接続を試みてる
> のが原因じゃないのかな?
ああ、そっか。その可能性もありますね。
WNetCancelConnection2 の第3引数が false だから切断しないというのはおかしいでし
ょう。
> 接続上に開いているファイルやジョブが存在する場合でも切断を行うかどうか
> 指定します。FALSE を指定した場合、開いているファイルやジョブがあると
> 関数は失敗します。
http://msdn.microsoft.com/ja-jp/library/cc446998.aspx
というわけなので、開いているファイルやジョブがなければ切断します。
俺は勘違いしていて、WNetCancelConnection2 の第2引数が 0 だから、切断しても接続
情報は記憶しているはずだと思ってたんですね。だからそこは原因ではないと。
でも、それが関係してくるのは WNetUseConnection の第5引数に
CONNECT_UPDATE_PROFILE を含めた場合であって、今回のケースには該当しませんね。
完璧に勘違いしていました。
falseでも切断するんですね。
切断しなければ再度ログイン画面を表示しないで
ログインできました。
考えてみれば普通のことでした。
回答を下さった皆さま、有難うございました!