DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ネットワークドライブの割り当て

環境/言語:[XP Pro VB2003 Framework1.1]
分類:[.NET]

いつも拝見しています。分からないことがあるので教えてください。
APIによるネットワークドライブの割り当てについてです。
ネットで調べてサンプルはたくさんあるのですが、どうやってもうまくいきません。現時点では、エラーコード1200が返ってきます。長くなってしまいますが
現在のソースです。

'////API
'ネットワークドライブをマッピングするAPI
'arg1:接続するリソースを指定するNETRESOURCE構造体のデータ
'arg2:接続の際に使用するパスワード。NULLを指定可能
'arg3:接続の際に使用するユーザ名。NULLを指定可能
'arg4:接続の種類を表すビットマスク
<DllImport("mpr.dll", CharSet:=CharSet.Auto)> _
Friend Function WNetAddConnection2(ByRef lpNetResource As NETRESOURCE,_
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Int32) As Int32
End Function

Friend Structure NETRESOURCE
Dim dwScope As Int32 'リソースの範囲
Dim dwType As Int32 'リソースの種類
Dim dwDisplayType As Int32 '表示タイプ
Dim dwUsage As Int32 'リソースの用途
Dim lpLocalName As String 'ドライブ名
Dim lpRemoteName As String 'リモート名
Dim lpComment As String '
Dim lpProvider As String '
End Structure
'================================================
'dwScope // リソースの範囲
'列挙するリソースの範囲を指定します。次の値のいずれかを指定します
'================================================
'現在接続されているすべてのリソース(dwUsage パラメータ
'は無視されます)
Friend Const RESOURCE_CONNECTED = &H1
'呼び出し側のネットワークコンテキスト内([ネットワーク
'コンピュータ]に表示される範囲)のリソース(dwUsage
'パラメータは無視されます)
Friend Const RESOURCE_CONTEXT = &H5
'ネットワーク上のすべてのリソース
Friend Const RESOURCE_GLOBALNET = &H2
'記憶されている接続(dwUsage パラメータは無視されます)
Friend Const RESOURCE_REMEMBERED = &H3
'================================================
'dwType // リソースの種類
'列挙するリソースの種類を指定します。次の値を組み合わせて指定します
'================================================
'すべてのリソース(RESOURCETYPE_DISK または RESOURCETYPE_PRINT
'との組み合わせは不可)
Friend Const RESOURCETYPE_ANY = &H0
'すべてのディスクリソース
Friend Const RESOURCETYPE_DISK = &H1
'すべての印刷リソース
Friend Const RESOURCETYPE_PRINT = &H2
'================================================
'dwDisplayType // 表示タイプ
'エクスプローラなどで表示されるオブジェクトのタイプ
'================================================
'一般
Friend Const RESOURCEDISPLAYTYPE_GENERIC = &H0
'ドメイン
Friend Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
'サーバ
Friend Const RESOURCEDISPLAYTYPE_SERVER = &H2
'共有
Friend Const RESOURCEDISPLAYTYPE_SHARE = &H3
'================================================
'dwUsage // リソースの用途
'列挙するリソースの用途を指定します。次の値を組み合わせて指定します。
'================================================
'0 すべてのリソース
' すべての接続可能なリソース
Friend Const RESOURCEUSAGE_CONNECTABLE = &H1
' すべてのコンテナリソース
Friend Const RESOURCEUSAGE_CONTAINER = &H2

Friend Const CONNECT_UPDATE_PROFILE As Int32 = &H1



Function ConnectNetworkDrive(ByVal i_remotename As String, _
ByVal i_drivename As String, _
ByVal i_username As String, _
ByVal i_password As String)As Boolean
ConnectNetworkDrive = False
Dim netres As NETRESOURCE
Dim ret As Int32
With netres
.dwScope = RESOURCE_GLOBALNET
.dwType = RESOURCETYPE_ANY
.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC
.lpLocalName = i_drivename
.lpRemoteName = i_remotename
End With
ret = WNetAddConnection2(netres, i_password, i_username, 0)
If ret = 0 Then Return True
End Function

API呼び出し側

    ConnectNetworkDrive("\\127.0.0.1\TEST", "M:", "user", "pass")

ユーザとパスワードは入れても入れなくても同じ状況です。

実現方法は別にAPIでなくても構わないのですが、なぜできないのかが
まず知りたいです。お願い致します。
理解してから実行してますか?

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwnet/html/_win32_wnetaddconnection2.asp
からの引用。

lpLocalName メンバが空でない文字列を指す場合は、
dwType メンバを RESOURCETYPE_DISK または RESOURCETYPE_PRINT に設定します。

ちなみに1200はERROR_BAD_DEVICEです。
エラー番号はwinnetwk.hおよびwinerror.hを見て調べてください。
※このファイルは、VC++をインストール後Program Files\Microsoft Visual Studio\VC98\Includeにあります。
返信ありがとうございます。

>
> lpLocalName メンバが空でない文字列を指す場合は、
> dwType メンバを RESOURCETYPE_DISK または RESOURCETYPE_PRINT に設定します。

 これは修正しましたが、同じエラー番号が返ってきます。

>
> ちなみに1200はERROR_BAD_DEVICEです。
> エラー番号はwinnetwk.hおよびwinerror.hを見て調べてください。
> ※このファイルは、VC++をインストール後Program Files\Microsoft Visual Studio\VC98\Includeにあります。
>

 VC++はありませんのでインストールできませんが、
 ERROR_BAD_DEVICEのエラーは教えていただいた参考リンクに
 「lpLocalName で指定した値が無効です。」となっていますが
 lpLocalNameの設定がおかしいとは思えませんし・・・

困りました。
構造体への設定は漏れなくしたほうがよいですよ。

Friend Const RESOURCE_GLOBALNET = &H2
Friend Const RESOURCETYPE_DISK = &H1
Friend Const RESOURCEDISPLAYTYPE_SHARE = &H3
Friend Const RESOURCEUSAGE_CONNECTABLE = &H1

の組み合わせではどうなりますか?
■No20073に返信(まどかさんの記事)
> 構造体への設定は漏れなくしたほうがよいですよ。
>
> Friend Const RESOURCE_GLOBALNET = &H2
> Friend Const RESOURCETYPE_DISK = &H1
> Friend Const RESOURCEDISPLAYTYPE_SHARE = &H3
> Friend Const RESOURCEUSAGE_CONNECTABLE = &H1
>
> の組み合わせではどうなりますか?

遅くなりました。試してみます。
■No20087に返信(maruさんの記事)
> ■No20073に返信(まどかさんの記事)
>>構造体への設定は漏れなくしたほうがよいですよ。
>>
>>Friend Const RESOURCE_GLOBALNET = &H2
>>Friend Const RESOURCETYPE_DISK = &H1
>>Friend Const RESOURCEDISPLAYTYPE_SHARE = &H3
>>Friend Const RESOURCEUSAGE_CONNECTABLE = &H1
>>
>>の組み合わせではどうなりますか?
>
> 遅くなりました。試してみます。

 試してみましたが、
この組合せでも同じエラーコードが返ってきます。
 ???
すいません。
デバッグしている余裕がありませんので、検索するなりして試行錯誤してみてください。
XPでの権限等の問題もあるやらないやらのようですので、Windows2000で試してみるなどもしてみてください。
一応VB6での実績がありますのでできないことは無いはずです。
■No20090に返信(まどかさんの記事)
> すいません。
> デバッグしている余裕がありませんので、検索するなりして試行錯誤してみてください。
> XPでの権限等の問題もあるやらないやらのようですので、Windows2000で試してみるなどもしてみてください。
> 一応VB6での実績がありますのでできないことは無いはずです。

ありがとうございます。色々試してみます。
結果は報告します。
どこがおかしいのか分かりました。
CharSet:=CharSet.Auto ⇒CharSet:=CharSet.Ansi
に変更することでできました。
すごく単純なことでしたが、Autoというぐらいだから自動的に
認識してくれるものだと勝手に思っていました。なぜAnsiならいいのか
細かいことは・・・・
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板