GetDriveTypeの最後が円記号がないのになぜ正常動作?

解決


tonton  2010-02-02 20:50:13  No: 143175  IP: [192.*.*.*]

XP上でVB6.0を使用しています。
タイトルでも書きましたが
GetDriveTypeの引数値の最後が円記号がないのに戻り値は正常な値を返しています。
例えば本来MSDNなどをみるとA:\が正しいのでしょうが、A:でも
同様の結果を返します。
というのも既存ソースを修正する事になり別の作成者が
Mid(sPath,1,2)  ※sPath変数(String)の中身はA:\
などと書いてありMid(sPath,1,2)をMid(sPath,1,3)した方がいいのか
迷っています。
問題なく動作するなら余計なところは直すなとの上司のお達しの為です・・・
正式リリースされているPGMなので問題なく動作しているという事らしいのですが。

編集    削除
魔界の仮面弁士  2010-02-02 22:20:44  No: 143176  IP: [192.*.*.*]

末尾に \ が無い場合、基本的には DRIVE_NO_ROOT_DIR が返されます。

少なくとも XP においては、ドライブレターの場合のみ、例外的に
どちらでも動作してしまうのかもしれませんが、基本的には
末尾に \ が必要とされているようです。

たとえば以下のパターンでは、\ の有無で動作が変化します。


(1) C:\test の下に、Sample という空フォルダを配置しておく。
(2) USB フラッシュメモリーを接続する。
(3) [マイ コンピューター]を右クリックし、[管理]を選択。
(4) [記憶域]-[ディスクの管理]で、(2)のリムーバブルディスクを選択。
(5) 右クリックし、[ドライブ文字とパスの変更]を選択。
(6) [追加]を押して、C:\test\Sample にマウントする。

この状態においては、
  GetDriveType("C:\test\sample\") … 2 , DRIVE_REMOVABLE
  GetDriveType("C:\test\sample")  … 1 , DRIVE_NO_ROOT_DIR
  GetDriveType("C:\test\")        … 3 , DRIVE_FIXED
  GetDriveType("C:\test" )        … 1 , DRIVE_NO_ROOT_DIR
  GetDriveType("C:\")             … 3 , DRIVE_FIXED
  GetDriveType("C:")              … 3 , DRIVE_FIXED
という結果になるようです。


また、論理ドライブ(C: など)ではなく、物理ドライブ指定では、
  GetDriveType("\\?\PhysicalDrive0\") … 3 , DRIVE_FIXED
  GetDriveType("\\?\PhysicalDrive0")  … 1 , DRIVE_NO_ROOT_DIR
という結果を返しますので、やはり末尾 \ が必要であるといえます。

また、別マシン上の共有フォルダへのアクセス時(UNCパス)も同様です。
  GetDriveType("\\?\UNC\ServerName\ShareName\DirName\") … 4 , DRIVE_REMOTE
  GetDriveType("\\?\UNC\ServerName\ShareName\DirName")  … 1 , DRIVE_NO_ROOT_DIR
  GetDriveType("\\?\UNC\ServerName\ShareName\")         … 4 , DRIVE_REMOTE
  GetDriveType("\\?\UNC\ServerName\ShareName")          … 1 , DRIVE_NO_ROOT_DIR
  GetDriveType("\\?\UNC\ServerName\IPC$\")              … 4 , DRIVE_REMOTE
  GetDriveType("\\?\UNC\ServerName\IPC$")               … 1 , DRIVE_NO_ROOT_DIR

  GetDriveType("\\ServerName\ShareName\DirName\")       … 4 , DRIVE_REMOTE
  GetDriveType("\\ServerName\ShareName\DirName")        … 1 , DRIVE_NO_ROOT_DIR
  GetDriveType("\\ServerName\ShareName\")               … 4 , DRIVE_REMOTE
  GetDriveType("\\ServerName\ShareName")                … 1 , DRIVE_NO_ROOT_DIR
  GetDriveType("\\ServerName\IPC$\")                    … 4 , DRIVE_REMOTE
  GetDriveType("\\ServerName\IPC$")                     … 1 , DRIVE_NO_ROOT_DIR


> Mid(sPath,1,2)  ※sPath変数(String)の中身はA:\
> などと書いてありMid(sPath,1,2)をMid(sPath,1,3)した方がいいのか
> 迷っています。
sPath の内容が "A:\" 形式なのは固定的なのでしょうか?

UNC パス、\\?\〜 や \\.\〜 形式のパスが指定される事がありえるなら、
そもそも Mid する前に、内容チェックを行う必要があるかと思います。

編集    削除
tonton  2010-02-02 22:44:51  No: 143177  IP: [192.*.*.*]

なんか私以上に色々試していただいて大変恐縮です・・・

> sPath の内容が "A:\" 形式なのは固定的なのでしょうか?

A:\ または A:\DIR のようにルート直下ディレクトリまでです。
したがって最終的な値はいずれにしろA:となります。
となるとどちらでもうまくいくという事になりますね。
(例外的にという枠内で)

前に書いてないのですがMid(sPath,1,2)、Mid(sPath,1,3)
が複数のPGM(exe)でたぶん作成者によってコーディングが違っており
設計者なり共通仕様チームなり統一させとけ!と個人的に思っているのですが。(後の奴がいっつも苦労する...)すいません愚痴りました(−−;

少し不安なのは動作環境はOSがNT3.51、2000、2003、XP、Vistaとある事と
VB6.0以外にもVB4.0版もあるそうで。
同じ動作するのか不安です・・・MSDNには円記号つきの説明なので
本来なら仕様も含め統一した方がいいのでしょうが、現在障害がないなら
変えるなという指令なので・・・

編集    削除
魔界の仮面弁士  2010-02-03 06:01:49  No: 143178  IP: [192.*.*.*]

今回の件に限らず、「潜在バグの可能性があるが、現状は期待動作している」状況なら、
修正候補として挙げておくべきだと思います。
直す/直さないの判断を下すのは、その後の話ですよね。

> 問題なく動作するなら余計なところは直すなとの上司のお達しの為です・・・
直さないというのも、それはそれで一つの解だと思います。
外部の人間がどうこう言える事では無いので、私からは
直すべきとも修正不要とも言えませんが、まずは
上司と十分に話し合ってみて、その上で決められては如何でしょう?

> 少し不安なのは
不安ならば実際に試してみては如何でしょう。
やきもきしているだけでは何も変わりませんし。

> 動作環境はOSがNT3.51、2000、2003、XP、Vistaとある事と
9x 系と Win7/2008/2008R2 は除外なのですね。
…ところで、NT4.0 は? 2003R2 は?

> VB6.0以外にもVB4.0版もあるそうで。
VB4 には、16bit版と 32bit版の 2 種類がありますね。
(おそらくは 32bit版を使うのでしょうけれども)

編集    削除
tonton  2010-02-05 00:30:43  No: 143179  IP: [192.*.*.*]

確かにどこかに証跡を残しておくべきですね。
今回はあくまで緊急、暫定の対応らしいので
正式対応時にきっちりやる事にします。

> 9x 系と Win7/2008/2008R2 は除外なのですね。
> …ところで、NT4.0 は? 2003R2 は?
ないようです。というか開発環境が書いたOSしかないので
どうしようもないです。
あと32bit版です。久々にNT3.51上にVBのっかっているので
使いましたが懐かしくもあり不便さも感じます。
でも軽いですね動作が...シンプルな分。
今使うとXPやVistaは進化してる割に遅いですね。
携帯のメニュー操作もそうですけど
進化にレスポンス向上をもっと優先してほしいですね。

編集    削除