WNetUseConnectionについて

[戻る]
初心者 2009/09/07(月) 14:47:14
始めまして、お願いします。

作成中のアプリ(VC2005 MFC)から、ネットワーク接続の共有フォルダへアクセスする際、
@ネットワークリソースに未接続の場合はログイン画面を表示し、ログインさせる
Aネットワークリソースに接続済みの場合は、そのまま。
という動作をしたいと思っています。

以下のサイトを参考に、下記コードを書きました。
http://re-thinkthings.spaces.live.com/Blog/cns!1C5AE98DA3645F42!641.entry

 // WNet API を使い、ネットワークリソースに対して認証を行う
    NETRESOURCE nr;
    ZeroMemory(&nr, sizeof(NETRESOURCE)); 

    DWORD dwFlags =  CONNECT_INTERACTIVE;

    nr.dwType        = RESOURCETYPE_DISK;    // リソースは共有フォルダ(ディスク)
    nr.lpRemoteName = ”共有フォルダパス”;        // 接続する共有フォルダ名 

    DWORD dwResult;
    TCHAR szAccessName[1024];
    DWORD dwBufferSize = lstrlen(lpszShareName) + sizeof(TCHAR); 

    //接続
    DWORD dwRes = WNetUseConnection(hWnd,            //オーナーウィンドウ
                                  &nr,            //接続の詳細
                                  NULL,            //ユーザー
                                  NULL,            //パスワード
                                  dwFlags,        //接続オプション
                                  szAccessName,    //システム要求を保持するバッファ
                                  &dwBufferSize,    //バッファサイズ
                                  &dwResult);        //接続情報を受け取る

    if (dwRes == NO_ERROR)
    {
        //成功or接続済み
        bRet = TRUE;
    }
    return bRet;

が、アクセス先の共有リソースが、
IPアドレス:192.168.1.XX
ホスト名:HogeHostName
となっている場合、
"\\192.168.1.XX\HogeFolder"
だとOKなのですが、
"\\HogeHostName\HogeFolder"
だとNGになってしまいます。

これはなぜでしょうか?

PATIO 2009/09/07(月) 15:51:40
エラーコードとか必要ならWNetGetLastErrorの結果とか
そういう情報が足りないと思います。
NGになってしまいますでは、どういうエラーになっているのか
わかりません。

単純に考えれば、ホスト名からアドレスが解決できない為に
エラーになっているのではないかと思いますが、
エラーコードの提示が無いのでなんとも。

初心者 2009/09/07(月) 16:05:36
情報不足でした。

エラーは「ERROR_SESSION_CREDENTIAL_CONFLICT」が
返ってきます。

このエラーは二重ログインエラーらしいですが、
"\\192.168.1.XX\HogeFolder"
では、先述した@とAの動作が実現できます。

"\\HogeHostName\HogeFolder"
は、すでにログインしているとERROR_SESSION_CREDENTIAL_CONFLICTが返ってきます。

この違いはなぜでしょうか?

PATIO 2009/09/08(火) 17:46:17
そのPCからその共有名ですでに接続しているからでは?
エクスプローラーとかで覗いたりしていれば、接続していると思います。
ネットワークドライブに割り付けたりしていたら接続済み状態でしょうし。

COF 2009/09/09(水) 18:36:13
>そのPCからその共有名ですでに接続しているからでは?
既に接続済みの場合は、先述したAの動作をしてほしいのです。
(WNetUseConnection()でNO_ERRORが返ってきてほしいのです)

・IPアドレスで既にログインしている場合、
WNetUseConnection()でIPアドレスでログイン
→二重ログインエラーにならずにNO_ERRORが返ってくる

・ホスト名で既にログインしている場合、
WNetUseConnection()でホスト名でログイン
→二重ログインエラーが返ってくる。

この違いななぜでしょうか?という質問です。
説明下手で申し訳ありません。

個人的にはWNetUseConnection()の第5引数の接続オプションがあやしいと思って
いるのですが、
CONNECT_INTERACTIVE
CONNECT_PROMPT
CONNECT_REDIRECT
CONNECT_UPDATE_PROFILE
の内、その組み合わせが正しいのかヘルプを見ても分かりません。

この辺をお分りになる方、ご教授ください。

bun 2009/09/10(木) 10:20:20
こちらで試してみたら、うまくいきました(^-^)
たぶんですが、コーディングの問題では無いと思います。

ファイル名を指定して実行にて[\\HogeHostName\HogeFolder]で開くことはでき
るでしょうか?

LinuxサーバやVPN接続など、状況によっては、IPアドレスでしかアクセスできな
くなることがあります。

古いスレッドには追加発言できません。