始めまして、お願いします。
作成中のアプリ(VC2005 MFC)から、ネットワーク接続の共有フォルダへアクセスする際、
①ネットワークリソースに未接続の場合はログイン画面を表示し、ログインさせる
②ネットワークリソースに接続済みの場合は、そのまま。
という動作をしたいと思っています。
以下のサイトを参考に、下記コードを書きました。
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になってしまいます。
これはなぜでしょうか?
エラーコードとか必要ならWNetGetLastErrorの結果とか
そういう情報が足りないと思います。
NGになってしまいますでは、どういうエラーになっているのか
わかりません。
単純に考えれば、ホスト名からアドレスが解決できない為に
エラーになっているのではないかと思いますが、
エラーコードの提示が無いのでなんとも。
情報不足でした。
エラーは「ERROR_SESSION_CREDENTIAL_CONFLICT」が
返ってきます。
このエラーは二重ログインエラーらしいですが、
\\192.168.1.XX\HogeFolder
では、先述した①と②の動作が実現できます。
\\HogeHostName\HogeFolder
は、すでにログインしているとERROR_SESSION_CREDENTIAL_CONFLICTが返ってきます。
この違いはなぜでしょうか?
そのPCからその共有名ですでに接続しているからでは?
エクスプローラーとかで覗いたりしていれば、接続していると思います。
ネットワークドライブに割り付けたりしていたら接続済み状態でしょうし。
>そのPCからその共有名ですでに接続しているからでは?
既に接続済みの場合は、先述した②の動作をしてほしいのです。
(WNetUseConnection()でNO_ERRORが返ってきてほしいのです)
・IPアドレスで既にログインしている場合、
WNetUseConnection()でIPアドレスでログイン
→二重ログインエラーにならずにNO_ERRORが返ってくる
・ホスト名で既にログインしている場合、
WNetUseConnection()でホスト名でログイン
→二重ログインエラーが返ってくる。
この違いななぜでしょうか?という質問です。
説明下手で申し訳ありません。
個人的にはWNetUseConnection()の第5引数の接続オプションがあやしいと思って
いるのですが、
CONNECT_INTERACTIVE
CONNECT_PROMPT
CONNECT_REDIRECT
CONNECT_UPDATE_PROFILE
の内、その組み合わせが正しいのかヘルプを見ても分かりません。
この辺をお分りになる方、ご教授ください。
こちらで試してみたら、うまくいきました(^-^)
たぶんですが、コーディングの問題では無いと思います。
ファイル名を指定して実行にて[\\HogeHostName\HogeFolder]で開くことはでき
るでしょうか?
LinuxサーバやVPN接続など、状況によっては、IPアドレスでしかアクセスできな
くなることがあります。