アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB6
ファイル/フォルダのアドレスを取得してファイル/フォルダの区別を
したいのですが、特定の物(サーバー内)がエラーしてしまいます。
リストへ"OLEDragDrop"した時に下記実行させています。
MsgBox Data.Files(1)
MsgBox GetAttr(Data.Files(1))
MsgBox Dir(Data.Files(1))
MsgBox Dir(Data.Files(1), vbDirectory)

エラーの対象 AとB & 問題無い C
A>ファイルの種類:Windows Server
A>アドレス:\\server
B>コンピューターの種類:Windows Server
B>アドレス:\\server\TestB
C>ファイルの種類:ファイルフォルダ
C>アドレス:\\St_server\TestB\TestC

Aは全てエラー
>実行時エラー'461':
>データの形式が一致しません。

Bはアドレスは取得出来て"Dir"でエラー (GetAttr = 16)
>実行時エラー'52':
>ファイル名または番号が不正です。

Bはアドレスを取得出来てるのでエラー処理で
なんとかなりそうなのですが、Aはアドレスすら取得出来ません。

Aのアドレスを取得するにはどうしたら良いでしょうか?
(サーバーは社内管理していて詳しくありません)

A 回答 (6件)

私の方でも確認しました。

確かに、コンピュータ名をドロップした場合、
Files プロパティにアクセスできないですね。

以下のコードを使えば、コンピュータ名は取得できました。

Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long

Private Sub LI1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim CF_FILENAMEW As Long
Dim file As String
CF_FILENAMEW = RegisterClipboardFormat("FileNameW")
If CF_FILENAMEW > 32767 Then CF_FILENAMEW = CF_FILENAMEW - 65536 ' 16bit値に変換
If Data.GetFormat(CF_FILENAMEW) Then
file = Split(Data.GetData(CF_FILENAMEW), Chr(0))(0) ' 末尾の'\0'を削除
MsgBox file
End If
End Sub
    • good
    • 0
この回答へのお礼

回答有難う御座います。
"\\server"のパスを取得出来ました。
なるほど Clipboard を利用するんですね。コード詳細は後程確認してみます。

複数の場合は出来ないので"\\server"関連は一個単位にして
この方法でパスを取得します。(分類はフォルダ指定)
それ以外は"Data.Files.Count"と"Data.Files(1)"と"Dir"を使用し
ファイル/フォルダを区別します。

Exploreで開くも確認出来ました。
CreateObject("Shell.Application").Explore "\\server"

助かりました。

お礼日時:2010/04/08 16:24

>あとはserverも複数有るため、VBへドロップ時にserverのパス名を取得する方法だけです


これが何を言われてるのか良く分からないのですが
エクスプローラから選択ファイルを自作アプリにドラッグ&ドロップしたい
(そしてその方法が分からない)ということでいいのでしょうか?

そうだとしたら以下URL参考になりませんか
http://www.atmarkit.co.jp/fdotnet/dotnettips/676 …

関連情報(上のURL含む)は
ファイル ドラッグ ドロップ アプリケーション VB
のキーワードで検索かければ出てきます

※ 初めに書いたように自分でVB触ってないので確認などは一切していません
 (というか文法もちゃんと知りませんのでまともなアドバイスは出来ません)

ファイルフルパス名が分かれば1文字目の判断だけでドライブなのか
UNC名なのかの判断は出来るはずです

そうでない内容なのであれば実際にどのようにして何を行いたいのかを
もう少し詳しく書いていただかないと分かりません
    • good
    • 0
この回答へのお礼

足 度々の回答有難う御座います。
多数の質問で分かりにくくなってすみません。

エクスプローラーからVBへドロップした時に"\\Server" という文字(パス名)を得たいのです。

私の中でその唯一の方法が Data.Files(1) だったのですが、"\\Server"はエラーしてしまいます。
他にもファイルに対してのドラッグ/ドロップ方法は有るのですが
ファイルで無いため、このパスをVBでは取得出来ない??のでしょうか。
"\\Server"などサーバー類は手動でパスを入れるしかない?
------------------------------------------------------------------------
If Data.GetFormat(vbCFFiles) Then
'(ドロップファイルをWindows エクスプローラのファイル リストかどうかの判定)
で調べると、[\\Server]はFalse が返ってきます。他はTrue
[\\Server]は通常のファイル/フォルダ操作では出来ないみたいです。

お礼日時:2010/04/08 14:52

>BとCですが、Bをプロパティ表示すると全般にCP名・CP種類・ドメイン


>と表示され、編集出来ない様管理されています。

この辺りはファイルかフォルダかという話もありますが
アクセス権限がどのようになっているのかも関係しきてるのではないかと思います

試したわけではありませんので以下そのつもりで
WindowsのUNC(\\IPアドレス\**\**)形式で
ファイル名指定されている場合
A)がPC名=IPに該当するのは既に書いたとうり
B)の場合 必ずフォルダになるはずです
   ※ ここがきちんと確認したわけではないところですが
     Windowsの共有設定の関係上IP名に続く
     名称(単純に言えば \TestB にあたる部分)
     がファイル名になるという設定は出来ないはずです
     (必ず \\IP\共有フォルダ名 となるはず)
c)の場合はフォルダ名・ファイル名の場合も混在します

BとCの区別は \ の数を調べれば判断付くはずです

環境限定なのであればの話ですが上記条件で決め打ちで
作ってしまってもいいのではないかと思います(という勝手な意見)

OS上から普通にショートカット作ってもB の時はちょっと
特殊な作り方されてるようですので(リンク先の変更不可)
この辺り(ネットワークの共有フォルダ名)は
レジストリの情報見てた様な気もしますが未確認です
    • good
    • 0
この回答へのお礼

回答有難う御座います。
サーバー内のフォルダがなんとなく理解出来てきました。
>(必ず \\IP\共有フォルダ名 となるはず)
なるほどと思ったのですが、プリンタが2つ\\server\配下にありました。
まあこの辺は無視するしかないと思いますが・・。
\ の数でPC名判断は使わしてもらいます。

あとはserverも複数有るため、VBへドロップ時にserverのパス名を取得
する方法だけです。肝心なここが出来ないとこの一週間が無駄になってしまいます・・。

お礼日時:2010/04/08 13:06

> 実際にはPCが有る無しではなくショートカット用アドレスを取得したいです。



「アドレスを取得」というのがちょっと意味不明ですが、
ショートカットにしたりExplorerに使うのは、引数の「Data.Files(1)」そのままでOKでしょう。

> ドロップした物のアドレスを保管してショートカットで開くソフトを検討しています。
> (ファイル/フォルダ区別はフォルダの場合エクスプローラで開くため)

この場合、知りたいのは、引数が「ファイルなのかフォルダなのか」どちらなのか、ということですよね。

コンピュータ名は、「\\コンピュータ名」という形になってますから、
Left(Data.Files(1),2)="\\" And InStr(Mid(Data.Files(1),3),"\")=0
で判定できます。

それなら、コンピュータ名の時は、ファイルフォルダの判別処理は行わないようにし、開く時はフォルダと同様にエクスプローラで開くようにすればいいんじゃないでしょうか。

この回答への補足

すみません、マイコンピュータにはパスがありませんでした。
\\server\ などの サーバーのPC名でした。
serverのパス ⇒ \\server [Data.Files(1)] = ×
通常のパス ⇒ \\server\TestB [Data.Files(1)] = ○

補足日時:2010/04/08 12:55
    • good
    • 0
この回答へのお礼

回答有難う御座います。
すみません用語が不理解でした「アドレスを取得」= パス
「Data.Files(1)」でパスを取得出来ると思ったのですが、
PC名(マイコンピュータなど)をドロップするとData.Files(1)でエラーしてしまいます。
この時点で
>Left(Data.Files(1),2)="\\" And InStr(Mid(Data.Files(1),3),"\")=0
が利用出来ません。
Data.Files(1)の使い方がおかしいのでしょうか?

Private Sub LI1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
MsgBox Data.Files(1)
End Sub

お礼日時:2010/04/08 12:46

ちょっと追記


A)は#1に書いたようにPC名に該当します

> B>コンピューターの種類:Windows Server
> C>ファイルの種類:ファイルフォルダ

とかかれてますがこれが間違い
両方ともファイルもしくはフォルダとなります
    • good
    • 0
この回答へのお礼

回答有難う御座います。
なんとなく見えてきた気がします。
PC名にファイルやフォルダ操作は出来ないって事ですね。

BとCですが、Bをプロパティ表示すると全般にCP名・CP種類・ドメイン
と表示され、編集出来ない様管理されています。
B(フォーム名:TestA-Serverのプロパティ)
C(フォーム名:TestBのプロパティ)
でもアドレスは表示されるので確かにフォルダですね。

実際にはPCが有る無しではなくショートカット用アドレスを取得したいです。
ドロップした物のアドレスを保管してショートカットで開くソフトを検討しています。
(ファイル/フォルダ区別はフォルダの場合エクスプローラで開くため)

お礼日時:2010/04/08 11:15

VBについては使ってないので知りません


A)はファイルやフォルダではなくてPC名(IPアドレス)に該当するものになります
(ファイル操作とは根本的な扱いが違います)

そのPCが存在しているかを知りたいのでしょうか?
PING投げて応答が返ってくるか(但しPing応答許可していない可能性もあると思います)
位しかないのではないでしょうか
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!