WNetUseConnectionの接続について – プログラミング – Home

通知
すべてクリア

[解決済] WNetUseConnectionの接続について


Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

以前も同じような質問をさせてもらったんですが、
再度質問です。

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;
}


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

Vista の場合、接続済みでなければ「// 認証ダイアログを表示」とコメントされている
ところのコードへ来る、接続済みならば最初の WNetUseConnection で成功する、XP で
は最初の実行は常に失敗する、ということでよろしいですか?
また、失敗する際のエラーコードは常に ERROR_LOGON_FAILURE ですか?


返信引用
Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

aetos様

おっしゃる通りの動作です。
XPの場合、一度目のWNetUseConnectionで
常にERROR_LOGON_FAILURE(1326)が返ってきます。

VistaとXPでAPIの動作が違うなんてことがあるのでしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> VistaとXPでAPIの動作が違うなんてことがあるのでしょうか?

あり得ると思います。

あるいは、何か XP の方がそういう設定になっているのかもしれません。

この辺りを試してみるとか。
http://pnpk.net/cms/archives/320


返信引用
Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

>この辺りを試してみるとか。
> http://pnpk.net/cms/archives/320
XPで見てみましたが、なにも保存されていませんでした。
でも関係ありそうな感じです。

XPの設定を調べてみます。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

>// フォルダ接続を一旦解除
>DWORD dwCancel = ::WNetCancelConnection2(lpszShareName, 0, FALSE);

ここで切ってるのと

>netResource.lpRemoteName = 接続先;

こいつは、同じ場所?


返信引用
Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

同じ場所です。
すいません、変え忘れました。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

すると

いったん切断してから、接続を試みてる

のが原因じゃないのかな?
一旦解除している部分をコメントアウトしてみたらどうでしょうか?


返信引用
Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

WNetCancelConnection2の第三引数をFALSEにしているため、
実際はここでは切断はしていません。

もともとあったコードなのですが、
あまり意味ない?のかな。消してもいいと思っていますが。。。

やはりOSの設定(仕様?)なのかもしれません。
もう少し調べてみて、情報がなければ
このままで行こうと思います。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> いったん切断してから、接続を試みてる
> のが原因じゃないのかな?

ああ、そっか。その可能性もありますね。

WNetCancelConnection2 の第3引数が false だから切断しないというのはおかしいでし
ょう。

> 接続上に開いているファイルやジョブが存在する場合でも切断を行うかどうか
> 指定します。FALSE を指定した場合、開いているファイルやジョブがあると
> 関数は失敗します。

http://msdn.microsoft.com/ja-jp/library/cc446998.aspx

というわけなので、開いているファイルやジョブがなければ切断します。

俺は勘違いしていて、WNetCancelConnection2 の第2引数が 0 だから、切断しても接続
情報は記憶しているはずだと思ってたんですね。だからそこは原因ではないと。
でも、それが関係してくるのは WNetUseConnection の第5引数に
CONNECT_UPDATE_PROFILE を含めた場合であって、今回のケースには該当しませんね。


返信引用
Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

完璧に勘違いしていました。
falseでも切断するんですね。

切断しなければ再度ログイン画面を表示しないで
ログインできました。
考えてみれば普通のことでした。

回答を下さった皆さま、有難うございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました