🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.visualbasic
Article #372

Re: [Q]: リモート名を所得する方法

#372
From: Sato Masahiro
Date: Mon, 23 Mar 1998 00:00
99 lines
4000 bytes
#fj.lang.visualbasic と fj.os.ms-windows.programming にクロスポストします。

In article <6f022j$jeq$1@nn-tk002.ocn.ad.jp>, Kazuo Yamamoto wrote:
>APIはわかったのですが
>Declare Function WNetGetUniversalName Lib "mpr" Alias
(中略)
>Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" _
(中略)
>の使い方が資料が足りなくてわかりません。
>どなたかわかる方いませんか

とのことですが、やはり API 関数を使用する際には、何らかの資料を
そろえる方が確実かと思います。

使い方についてですが、簡単に述べるとすると、以下のように
なるでしょう。

まず、WNetGetUniversalName 関数の第三引数は、以下のユーザ定義型の
情報を受け取ります。

Type UNIVERSAL_NAME_INFO
	lpUniversalName As Long
	buf(100) As Byte
End Type

ここで、

Dim uni As UNIVERSAL_NAME_INFO
Dim BufSize As Long
BufSize = 100

という様に変数を用意して、

WNetGetUniversalName "x:\hogehoge", UNIVERSAL_NAME_INFO_LEVEL, uni, BufSize

とすることによって、求める UNC 名(「ネットワークドライブ名」の
ことです)の情報を取得できます。UNC 名は、uni.buf に格納され、格納位置の
アドレスは uni.lpUniversalName に格納されます。

そこで、Win32 API の lstrcpy 関数を利用して、Visual Basic の文字列変数に
結果を複製します。

Dim RemoteName As String * 100
lstrcpy RemoteName, lpUniversalName

ただし、lstrcpy の Declare 宣言中で、第二引数を Byval lpszSrc As Long と
します。

以上によって、変数 RemoteName に、求める UNC 名を取得できました。

WNetEnumResource 関数の使用法も同様の手順に従います。まず、
WNetOpenEnum 関数によって列挙ハンドルをオープンします。

WNetOpenEnum RESOURCE_REMEMBERD, RESOURCETYPE_DISK, _
	RESOURCEUSAGE_CONNECTABLE, vbNullString, hEnum

あとは、例えば ERROR_NO_MORE_ITEMS が返されるまで WNetEnumResource 関数を
繰り返し実行することにより、記憶されている接続のローカル名と UNC 名を
次々と取得できます。

Entries = 1
BufSize = 1000
r = WNetEnumResource(hEnum, Entries, nr, BufSize)

ここで、変数 nr は以下のユーザ定義型の変数です。

Type NETRESOURCE
	dwScope As Long
	dwType As Long
	dwDisplayType As Long
	dwUsage As Long
	lpLocalName As Long
	lpRemoteName As Long
	lpComment As Long
	lpProvider As Long
	buf(1000) as Byte
End Type

WNetGetUniversalName の時と同様に、lpLocalName と lpRemoteName にそれぞれ
ローカル名と UNC 名の格納位置のアドレスが代入されます。

あとは、調べるローカル名と、列挙された nr.lpLocalName を比較して、
一致した時の nr.lpRemoteName が、求める UNC 名です。

If lstrcmp(LocalName, nr.lpLocalName) = 0 Then
	lstrcpy RemoteName, nr.lpRemoteName
	MsgBox RemoteName
End If

ただし、上記で、lstrcmp は、lstrcpy と同様に第二引数を値渡しの Long 型に
します。

なお、現在 Visual Basic を動かすことのできる環境にないため、
記述したコードが正しく動くかどうか、確認していませんのでご注意ください。

-- 
Computer Institute of Japan, Ltd.
佐藤正宏 masahiro@cij.co.jp
Technical Details
Message-ID: <6f55ua$o1u$1@hawaii.ykhm.cij.co.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6eqdet$hcb$1@nn-tk002.ocn.ad.jp> <6esjel$mnp$1@hawaii.ykhm.cij.co.jp> <6f022j$jeq$1@nn-tk002.ocn.ad.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 110a07,2b64c157a6ebfaef,start
X-Google-Attributes: gid110a07,public
X-Google-Thread: 105c2e,ac9e02ac2a64e0dd
X-Google-Attributes: gid105c2e,public
From: masahiro@cij.co.jp (Sato Masahiro)
Subject: Re: [Q]: リモート名を所得する方法
Date: 1998/03/23
Message-ID: <6f55ua$o1u$1@hawaii.ykhm.cij.co.jp>
X-Deja-AN: 336772995
References: <6eqdet$hcb$1@nn-tk002.ocn.ad.jp> <6esjel$mnp$1@hawaii.ykhm.cij.co.jp> <6f022j$jeq$1@nn-tk002.ocn.ad.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Organization: Computer Institute of Japan, Ltd.
Newsgroups: fj.lang.visualbasic,fj.os.ms-windows.programming