2009年10月17日土曜日

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

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

ソースが長いので、見づらい場合には閉じて下さい。
▼ソースを開く/たたむ
01.' **********************************************************
02.' ファイル選択ダイアログを表示し、ファイルパスを取得する
03.' **********************************************************
04.Function GetFilePath()
05. 
06.  ' 変数宣言
07.  FilePath = "" ' ファイルパス
08.  ExtName = "exe" ' 拡張子判断用
09. 
10.  ' 初期メッセージ
11.  Msgbox("パスを取得するファイル(." & ExtName & ")を選択して下さい。")
12. 
13.  ' IEオブジェクトを用意
14.  Set Ie = CreateObject("InternetExplorer.Application")
15.  Ie.Navigate( "about:blank" )
16.  Ie.document.getElementsByTagName("BODY")(0).innerHTML = _
17.    "<INPUT id=FilePath type=file><TEXTAREA id=Text></TEXTAREA>"
18.  Ie.document.getElementById("FilePath").click
19. 
20.  ' 選択ファイルパス格納
21.  FilePath = Ie.document.getElementById("FilePath").value
22. 
23.  ' 選択ファイルパスチェック
24.  If FilePath = "" then
25.    ' ファイルが選択されなかったので終了
26.    Msgbox("ファイルが選択されなかったので終了します。")
27.    Wscript.Quit
28.  end If
29. 
30.  Set Fso = CreateObject( "Scripting.FileSystemObject" )
31.  If Fso.GetExtensionName( FilePath ) <> ExtName then
32.    ' 実行ファイル(.exe)が選択されなかったので終了
33.    Msgbox("選択されたファイルが実行ファイル(." & ExtName & ")で無いので、終了します。")
34.    Wscript.Quit
35.  End If
36. 
37.  ' IE8の場合はセキュリティの関係上、
38.  ' 「C:\fakepath」となるので、別処理取得
39.  If InStr( FilePath, ":\fakepath\" ) = 2 Then
40.    ' コピー&ペースト用定数用意
41.    Const OLECMDID_COPY = 12
42.    Const OLECMDID_PASTE = 13
43.    Const OLECMDID_SELECTALL = 17 '(&H11)
44.    Const OLECMDEXECOPT_DODEFAULT = 0
45.    ' FilePathの内容をコピーし、Textへペースト
46.    Ie.Document.all.FilePath.focus
47.    Ie.ExecWB OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT
48.    Ie.ExecWB OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT
49.    Ie.Document.all.Text.focus
50.    Ie.ExecWB OLECMDID_PASTE,OLECMDEXECOPT_DODEFAULT
51.    FilePath = Ie.Document.all.Text.value
52.  End If
53. 
54.  ' Ie破棄
55.  Ie.Quit
56.  Set Ie = Nothing
57. 
58.  ' 最終的にファイルパス取得
59.  GetFilePath = FilePath
60. 
61.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 件のコメント:

コメントを投稿