開発環境
VB6.0 Windows2000
久々に質問させていただきます
今回、LANに接続されているネットワークコンピュータの
ドライブレター一覧の取得を行い、一覧表示を行う
ドライブを選択するとその中のフォルダを表示する
フォルダを選択するとファイルを表示するという
ローカル環境で行えばDriveListBoxとDirListBoxとFileListBoxで実現できる
処理を行いたいのですが
調べた所、WNetOpenEnumとWNetEnumResourceを用いることで出来るのでは?
と思いとりあえずローカルマシンに共有フォルダを5つ作成して
実行した所、1つだけ取得してERROR_NO_ITEMS(定数定義:259)で終了してしまいます
実行したソースは
RESOURCE_GLOBALNET=2
RESOURCETYPE_ANY=0
BUFSIZE=1000
nrA nrBはNETRESOUCE構造体
Type NETRESOUCE
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As String
lpRemoteName As String
lpComment As String
lpProvider As String
End Type
lngRet = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,nr,hEnum)
Do WNetEnumResource(hEnum,-1,BUF(0),BUFSIZE) <> ERROR_NO_ITEMS
MoveMemory nrB , BUF(0), Len(nrB)
lstrcpy strRemoteName, nrB.lpRemoteName
Debug.Print strRemoteName
Loop
ということを行っています
A なぜ一つだけフォルダが出来るのでかということと
B この関連でドライブレターは取得できるのでしょうか?
C サンプル等ではBUF(0)からAPI MoveMemoryを用いると
NETRESOURCE構造体のlpRemoteNameに格納されているのを見かけるのですが
どうしてもlpCommentに格納されてしまいます
不明点の多いまま質問している為、不明な所はご指摘願います
ドライブレター一覧…C: とか D: とか必要なんですか?
共有フォルダ名で良いです?
調べようかと思ってAPIの定義から確認しようとして
WNetEnumResource をぐぐったらいきなりサンプルが
引っかかって提示コードをデバックする気が失せたんで、
回答になってませんけど、それでもいいですか( _)_
http://nienie.com/~masapico/api_WNetEnumResource.html
サンプルコードそのままコピペで自分のPCの共有フォルダは
全て表示されてしまいました。
特攻隊長まるるうさんありがとうございます
やっぱAPI名でググルとそれがTOPに来ますよね
一応そのページを参照させていただいた結果だったのでちとショック・・・
あとはネットワーク環境の問題とかその辺りになりそうな気配が充満してきました
実際やりたい作業は
相手先にあるファイルをローカルにコピーするというもの
その時にサーバ名はINIファイルに記述し
そのサーバのドライブレター(C$\ D$\等)を選択
フォルダを選択
ファイルを選択
選択したファイルをローカルの特定フォルダにコピーするというもの
私どもの入力ミス(開発マシンとインターネット接続マシンが違うためコピペできない)も要因としてあるかもしれないので
もう少し検証してみます
お手数おかけしました
>そのサーバのドライブレター(C$\ D$\等)を選択
…いや、だから、$ってことは共有フォルダの指定じゃないのでは?
エクスプローラのマイネットワークで開いていってC$\とかいう
フォルダが公開されてる?
サンプルコードそのままだと表示されるのは共有フォルダのみ
ですし、ドライブレター(C: とか D: とか)ではなく、共有フォルダ
(ドライブ)名(\\サーバ名\共有フォルダ名)のみが表示されます。
コンピュータにアクセスする権限が無く、パスワードの入力が
必要な場合などは『アクセスが拒否されました。』とメッセージ
が出ました。
十分にデバッグされたコードならいいんだけど、提示された
コードはリンク先のコードと細かい点でかなり違うし、デバッグ
が必要な段階なのか?サンプルコードをそのままの形で
実行してうまくいかなかったのか?どこが?というのが結構
あいまいな質問なので有効な回答を付け難いです。
> …いや、だから、$ってことは共有フォルダの指定じゃないのでは?
> エクスプローラのマイネットワークで開いていってC$\とかいう
> フォルダが公開されてる?
http://support.microsoft.com/kb/314984
そう!そう!!、隠し共有という言葉が出てこなかったんです(TーT)
老化してるなぁ…痒いところに手が届くレス有難うございます。
すっきりしました(汗)
質問の仕方なっておらず申し訳ありません
最終的に行い事は隠し共有の表示です
コンボボックスに
C$\
D$\
E$\
と表示しDirListBoxのPathプロパティに
\\マシン名\C$\を指定してその中に存在するフォルダ一覧を表示
ということです
もし(私の知識で)出来ないならドライブ名もINIファイルに書き込んでも
よいですよ?との言葉を頂いたので、それが許されるならINIに書き込む方法を
最終的に取るかも知れません
どちらにしてもID・パスワードの問題は発生しますね・・・浅はかでした
ログインさえ出来ていれば、DirListBoxのPathプロパティには上記の事が実現できる
(フォルダのツリーが表示される)事は\\マシン名\ドライブ$を直打ちして確認しました
なので問題はパスワードですね
現状そちらも調査中としております
言い訳ですが
提示していただいたソースと私が最初に書いたソースが違うのは
各種サイトを見て回っているうちにそうなってしまったという
良い言い訳にもならないものでございます
また、共有フォルダの表示に関しての使い方もままなっていないので
もう少し考えてみます
というかもう一度入力しなおしてみます
最初の質問内容と150度くらい変わってしまっていることをお許しください
パスワード等に関しては
WNetAddConnection3
を調べれば出来そうという所に行き着いたので
それを調べて見ます
>もし(私の知識で)出来ないならドライブ名もINIファイルに書き込んでも
>よいですよ?
より検討してみたところ
逆にその方がメリットがあることに行き着きました
そもそもの仕様ミスです・・・ごめんなさい
結局ネットワーク先もドライブを選択できたほうがいいなぁ
というのが最初の要望だったのですが
検討結果・・・結局1つのドライブしかみないじゃんという結論になったんです
またログインに関しても
WNetAddConnection3に
マシン名、パスワード、ユーザID、NETRESOURCE構造体、再接続は試みないのでとりあえず最終引数には
マジックナンバーで0を指定し接続に成功しました
(この後きちんと定数定義します)
DirListBoxにもフォルダ一覧が正常に表示されました
一応質問の趣旨と解決方法が大きく変わってしまいましたが
解決とさせていただきたいと思います
また、共有フォルダが取得できなかった理由がわかった時は報告させて頂きます
隠し共有の取得についてない頭を絞ったので解決策を記述しておきます
前提条件として
接続先マシン名は固定の為INIファイルに記述している
起動時にWNetAddConnection2でログインを行わせる事を行っている
エラートラップにはOn Error Resume Nestを設定する
iをループカウンタとしたループでAsc("A")〜Asc("Z")までループし、
\\マシン名\chr(i) & "$"をDirListBox.Pathに設定する
正常に設定できた時はDirListBox.Pathの値が変化するので前回の値と比較する
前回と値が同じ=設定失敗
前回と値が違う=設定成功>コンボボックスにchr(i) & "$"を設定する
尚、一つも設定できなかった時は隠し共有(ドライブ)が存在しないことも考えられるが
今回の場合は権限不足によるものと判断し、終了以外の操作が出来ないように対応した
無駄が多いかもしれないけどなるべく私の頭で出来る範囲でやったらこういう解決法になりました
ツイート | ![]() |