2009年10月17日土曜日

VBScript fakepath回避選択ファイルパス取得サンプル

IEditorを作成した時に、
程よく使いやすいサンプルが出来たのでメモ。

ソースが長いので、見づらい場合には閉じて下さい。
▼ソースを開く/たたむ
' **********************************************************
' ファイル選択ダイアログを表示し、ファイルパスを取得する
' **********************************************************
Function GetFilePath()

  ' 変数宣言
  FilePath = "" ' ファイルパス
  ExtName = "exe" ' 拡張子判断用

  ' 初期メッセージ
  Msgbox("パスを取得するファイル(." & ExtName & ")を選択して下さい。")

  ' IEオブジェクトを用意
  Set Ie = CreateObject("InternetExplorer.Application")
  Ie.Navigate( "about:blank" )
  Ie.document.getElementsByTagName("BODY")(0).innerHTML = _
    "<INPUT id=FilePath type=file><TEXTAREA id=Text></TEXTAREA>"
  Ie.document.getElementById("FilePath").click

  ' 選択ファイルパス格納
  FilePath = Ie.document.getElementById("FilePath").value

  ' 選択ファイルパスチェック
  If FilePath = "" then
    ' ファイルが選択されなかったので終了
    Msgbox("ファイルが選択されなかったので終了します。")
    Wscript.Quit
  end If

  Set Fso = CreateObject( "Scripting.FileSystemObject" )
  If Fso.GetExtensionName( FilePath ) <> ExtName then
    ' 実行ファイル(.exe)が選択されなかったので終了
    Msgbox("選択されたファイルが実行ファイル(." & ExtName & ")で無いので、終了します。")
    Wscript.Quit
  End If

  ' IE8の場合はセキュリティの関係上、
  ' 「C:\fakepath」となるので、別処理取得
  If InStr( FilePath, ":\fakepath\" ) = 2 Then
    ' コピー&ペースト用定数用意
    Const OLECMDID_COPY = 12
    Const OLECMDID_PASTE = 13
    Const OLECMDID_SELECTALL = 17 '(&H11)
    Const OLECMDEXECOPT_DODEFAULT = 0
    ' FilePathの内容をコピーし、Textへペースト
    Ie.Document.all.FilePath.focus
    Ie.ExecWB OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT
    Ie.ExecWB OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT
    Ie.Document.all.Text.focus
    Ie.ExecWB OLECMDID_PASTE,OLECMDEXECOPT_DODEFAULT
    FilePath = Ie.Document.all.Text.value
  End If

  ' Ie破棄
  Ie.Quit
  Set Ie = Nothing

  ' 最終的にファイルパス取得
  GetFilePath = FilePath

End Function
以下参考メモ。 ソースの大本は、以下を参考にしました。 ファイル選択ダイアログを開く:SQLの窓 IEオブジェクトを作成した際にエラーチェックしていませんが、 「IEの入っていないWindows環境」を見たことがないのに加え、 Vista+IE8でも問題無く通過しているので、様子見の状態です。 このサンプルでは、 ファイルを選択した際に拡張子を判別しています。 別に無くても良いのですが、IEオブジェクトを使用するという仕様上、 ファイル選択ダイアログ時に拡張子を限定することが出来ないため、 仕方無くファイルを選択した後の判断となります。 IE8の場合、<INPUT>に格納されるファイルパスを取得した際に、 セキュリティの問題上「C:\fakepath\」となります。 その回避として、 何度も紹介させて頂いている以下のサイトを参考にしました。 IE8で、input type=fileの.valueがc:\fakepath\filenameを返す。(その2): Windows Script Programming

0 件のコメント:

コメントを投稿