web-dev-qa-db-ja.com

VBScriptから一般的な[名前を付けて保存]ダイアログを使用するにはどうすればよいですか?

VBScriptに[Windowsの名前を付けて保存]ダイアログボックスを表示させたいのですが、その方法がわかりませんでした。

このコードの使用:

Dim sfd
Set sfd = CreateObject("UserAccounts.CommonDialog")
sfd.ShowOpen

[開く]ダイアログを表示できますが、このオブジェクトにはShowSaveメソッドがありません(Visual Basicの非スクリプトに同様のオブジェクトがあるようです)。

StackOverflowを検索し、「[vbscript] savedialog」(および「WindowsScript Host」を使用)をグーグルで検索しましたが、Webページからの一般的なダイアログへのアクセスに関するスレッドとBrowseForFolderダイアログの解決策しか見つかりませんでした。 [保存]ダイアログの呼び出しについて。

実際、必要なのはファイル名だけなので、[開く]ダイアログを目的に使用できます...しかし、選択したパスに何かを保存したいので、ダイアログのタイトルバーにある[名前を付けて保存]を選択すると、より適切になります。

18
JayK

インストールする必要のある外部依存関係に依存せずに、XP以外のバージョンのWindowsでVBScriptから[名前を付けて保存]ダイアログボックスを表示する解決策はないと断言できます。 スクリプトの簡単なドラッグアンドドロップ展開に関してこれが引き起こす明らかな干渉は別として、セキュリティに関連する他の多くの問題を引き起こします。パーミッション、特に依存関係DLLをインストールして登録するためにクライアントのマシンでUACをバイパスする。

これまでに提案されたソリューションは、WindowsXPに含まれているDLLファイル、Windows XPの[ユーザーアカウント]コントロールパネルから[名前を付けて保存]ダイアログボックスを呼び出す、またはアンインストール後にMSComDlg DLLを残して、VBScriptから使用できるようにするためのソフトウェア。これらのソリューションはいずれも上記の要件を真に満たしておらず、提供された回答のいずれも、上記で触れたように、提案されたソリューションで発生する可能性のあるセキュリティ障害を考慮していません。

また、VBScriptからWindows API(非常に便利な[名前を付けて保存]ダイアログが含まれています)を直接呼び出すことはできないため(セキュリティ上のリスクが生じるだけでなく、VBScriptの緩い[ ?]入力)、それはほとんど誰もが寒さの中でこれをやりたいと思っているままにします。同様に、API呼び出しを行うことができないため、質問で提案されているように、 SetWindowText を呼び出して[開く]ダイアログのキャプションを変更するなどのハックを使用することもできません。

これは誰もが望んでいた答えではないことを私は理解しています。それは私が望んでいた答えでさえありません。しかし、残念ながら、それは正解です。

そうは言っても、考えられる回避策は次のとおりです。

  1. すでに提案されている回答のいずれかを受け入れることに傾倒している場合は、VBScriptデプロイメントにDLLファイルへの外部依存関係を導入することをすでに決定しています。飛躍した後、他のソースからDLLを「借用」したり、ハイジャックしたりするのはなぜですか。一度自分で作ってください。 Visual Basic 6を使用して、WindowsAPIによって提供されるネイティブの一般的なダイアログ関数をActiveXDLLにラップするのは簡単です。これは、VBScriptから呼び出すことができます。最近のほとんどのバージョンのWindowsには既にVisualBasicランタイムがインストールされていると予想されるため、リスクは最小限に抑えられます。また、おそらくVBScriptを既に知っているので、VB6でコードを叩いてはいけません。非常に難しい仕事になります。必要なカスタム機能を含めることができます。最も重要なのは、完全に制御できることです。他のアプリケーションのアンインストーラーがスクリプトに必要なDLLを削除することを心配する必要はありません。また、非推奨のランダムなアプリケーションのインストールとアンインストールに煩わされる必要もありません。指を交差させて希望します。プログラマーとして、それは決して良い選択肢ではないことを私たちは知っています。

    はい、Visual Basicが提供する共通ダイアログOCX(comdlg32.ocx)に依存するのではなく、WindowsAPIによって公開される共通ダイアログ関数を実際にラップすることをお勧めします。それはWindows7で問題を共有しており、Windowsの新しいバージョンが現在提供しているゴージャスな新しいダイアログを取得することはできません。 Open and Save Common Dialog APIについて知っておく必要のあるすべてのことと、それらをVB 6で使用する方法を説明する優れた記事は、 VBnetで入手可能 です。もちろん、本当にすべてをやりたいのであれば、一般的なダイアログで実行できる興味深いことがたくさんあり、すべて文書化されています(コード付き!) ここではVB Accelerator

  2. しかし、VBScriptで使用する一般的なダイアログ機能をラップするActiveX DLLをVB 6に書き込むことを皆さんに確信させたので、質問する必要があります。 ? VB 6でsomeコードを書くことに飛躍したら、allを動かしてみませんかあなたのコードをVB 6に入れますか?確かに、それは「死んだ」言語であり、すべてですが、VBScriptがひどくアクティブであるというわけでもありません。前に述べたように、構文の違いは事実上ゼロであり、VBScript開発者の学習曲線は予想できるほど浅いです。さらに、完全なIDE、静的型付け、(わずかに)優れたエラー処理、何とか何とか何とかというすべての利点が得られます。そうそう、WindowsAPI関数を直接呼び出すことができます。 VBScriptの唯一の本当の利点はその遍在性ですが、VBランタイムがインストールされていないコンピューターを見つけることができてからになります。言うまでもなく、一般的なダイアログボックスを必要とするアプリケーションを作成している場合は、おそらくユーザーとダイアログを使用しています。完全なVBその時点で便利になり始めるかもしれません。しかし、おそらくこのルートを選択する最大かつ最も重要な利点は、外部の「衛星」DLLを登録(または含める)する必要がなくなることです。単純なVB6アプリケーションはEXEのみで実行されます。 VBランタイムがインストールされているすべてのコンピューター。これは少なくともWindows7まで含まれています。

  3. そして最後に、低レベルのVBScriptからフル機能のVB 6に移行することに興奮している場合は、別のレンチを方程式に投入せざるを得ないと感じています。 VB.NETのような言語まで?繰り返しになりますが、.NET FrameworkのおかげでVB.NETにはあらゆる種類の新機能が提供されていますが、まともなVB/VBScript開発者がVB.NETでアプリを快適に作成できるようになるまでに数週間もかからないはずです。 。彼らはおそらく.NETFrameworkを完全に理解しておらず、オブジェクト指向の優れた設計手法を開発していないことは確かですが、少なくとも正しい方向に進んでいるでしょう。 VBScript(またはVB 6)で実行できるほとんどすべてのことは、VB.NETでも実行できます。そして、一般的に、.NET Frameworkによって公開された膨大な機能のおかげで、以前よりも手間が少なくて済みます。もちろん、欠点は、アプリで.NET Frameworkをユーザーのコンピューターにインストールする必要があることです。これは、VB 6ランタイムほどユビキタスではありません(ただし、現在でははるかに一般的です)ほんの数年前よりも)。

それで、それらはあなたが聞きたいと思っていた回避策ではなかったとあなたが言っているのを聞きますか?ええ、私も。私は人々にすべてを捨てて新しい言語を学ぶように言う人ではありません。 VBScriptが引き続き機能する場合は、それを実行してください。しかし、限界に挑戦し始めるその時点にいるのなら、おそらく飛躍する時です。

7
Cody Gray

VBScript(またはVBAまたはJScript)の共通ダイアログを使用する秘訣は、マシンにライセンスをインストールする必要があることです。 Visual Basic 6などの特定の開発ツールはライセンスをインストールしますが、無料のMicrosoft HTMLヘルプエディター(これはかなり古いアプリです)によってもインストールされます。興味深いのは、HTML Help Editorをインストールしてからアンインストールすると、Common DialogLicenseがそのまま残ることです。このため、ライセンスは無料で利用できると考えており、ここで作成するレジストリエントリを回答に含めます。

HKLM\Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905、 をセットする (Default)gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqjへのエントリ。

それが整ったら、次のようなコードを使用して、VBScript内からこれらのダイアログを作成できます。

Set objDialog = CreateObject("MSComDlg.CommonDialog")

ファイル保存ダイアログを起動するには、次のコードのようにShowSaveメソッドを使用します。

objDialog.ShowSave

もちろん、このオブジェクトには他にもたくさんのメソッドとプロパティがあり、ダイアログを起動する前に適切なプロパティを構成することをお勧めします。たとえば、特定のファイル拡張子のみがダイアログに表示されるようにファイルフィルターを設定できます。ここにMSDNサイトのコントロールへの素晴らしい参照があります: http://msdn.Microsoft.com/en-us/library/aa259661%28v=vs.60%29.aspx

お役に立てれば。ご不明な点がございましたらお知らせください。

11
oddacorn

これを展開するシステムをある程度制御でき、Visual Studio またはMicrosoft HTML Helpがインストールされていることを合理的に確信できる場合は、次のようなコードを使用できます。

function filedialog(filt, def, title, save)
    set dialog = CreateObject("MSComDlg.CommonDialog")
    dialog.MaxFileSize = 256
    if filt = "" then
        dialog.Filter = "All Files (*.*)|*.*"
    else
        dialog.Filter = filt
    end if
    dialog.FilterIndex = 1
    dialog.DialogTitle = title
    dialog.InitDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
    dialog.FileName = ""
    if save = true then
        dialog.DefaultExt = def
        dialog.Flags = &H800 + &H4
        discard = dialog.ShowSave()
    else
        dialog.Flags = &H1000 + &H4 + &H800
        discard = dialog.ShowOpen()
    end if
    filedialog = dialog.FileName
end function

また、この質問に対する他の回答の1つをVBScriptコードに適合させて(@oddacornに感謝します!)、ユーザーがVSまたはHTMLヘルプを使用できるかどうかが合理的に確信できない場合)、この関数を追加する必要があります。プログラムの起動時。すでにキーを持っていても心配しないでください。その場合、これは効果がありません。これは、管理者権限のない標準のユーザーアカウントで機能するはずです。

'Make the MSComDlg.CommonDialog class available for use. Required for filedialog function.
function registerComDlg
    Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
    objRegistry.CreateKey &H80000001, "Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905"
    objRegistry.SetStringValue &H80000001, "Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905", "", "gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj"
end function

HTMLのVBScriptコードの「ソースの表示」からfiledialog関数を適応させたことに注意してください ここ ;最新のWebブラウザーでは、コードサンプルのレンダリングに使用するHTMLが正しく表示されないようです(IE 8およびChromeでテスト済み)。しかし、幸いなことに、コードはまだビューにあります。ソース。

Windows 7(SP1、完全にパッチが適用されている)でこれを機能させるためにクリティカルであることが1つ見つかりました。あなたmustset dialog.MaxFileSize = 256または実行時エラーが発生します。

つまり、次のコードはWindows 7 SP1では失敗しますが、古いバージョンのWindowsではおそらく機能します。

Set x = CreateObject("MSComDlg.CommonDialog")
x.ShowSave
4
allquixotic

年齢を調べたところ、jsware.netで jsShell --Shell Component を見つけました。 ZipファイルにはjsShell.dllが含まれています 176 kB、dllを登録するためのvbscript 基本的にregsvr32.exe jsShell.dll、デモスクリプトおよび明確なドキュメント

DLLはWindows7でうまく機能し、[開く/保存]ダイアログを含むいくつかの便利な方法を提供します。

Dim jsS, sFileName
jsS = CreateObject("jsShell.Ops")
' Save as dialog
sFileName = jsS.SaveDlg("<title>", "exe") ' Example: Filter by exe files
sFileName = jsS.SaveDlg("<title>", "")    ' Example: No extension filter
' Open dialog
' Example: Filter by exe, initial dir at C:\
sFileName = jsS.OpenDlg("<title>", "exe", "C:\")

ファイルが選択されていない場合、sFileNameは空の文字列です。

0
Rob W
Private Sub cmdB1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdB1.Click
    Dim objExec, strMSHTA, wshShell, SelectFile

    SelectFile = ""

    ' For use in HTAs as well as "plain" VBScript:
    strMSHTA = "mshta.exe ""about:" & "<" & "input type=file id=FILE>" _
             & "<" & "script>FILE.click();new ActiveXObject('Scripting.FileSystemObject')" _
             & ".GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);" & "<" & "/script>"""

    wshShell = CreateObject("WScript.Shell")
    objExec = wshShell.Exec(strMSHTA)

    SelectFile = objExec.StdOut.ReadLine()
    Me.txtT0.Text = SelectFile
    objExec = Nothing
    wshShell = Nothing
    strMSHTA = Nothing
End Sub
0
niq

シェルを作成し、それをasp Webサイトにリンクし、Webサイトに方向タグを読み取らせました-ファイルの場所をロードしました。aspページは、そのファイルの場所内でファイルダイアログをすぐに開きます。ファイル名も指向性タグ。保存すると、シェルは消えます。

それがウェブサイトのディレクトリタグの制限である場合、すなわち(blah.com/temp.aspx?x=0&y=2&z=3)

情報をSQLデータベースまたはフラットファイルに保存します。回避策はたくさんありますが、上記のことは真実です。 VBSはそれを内部でカットしません。

0
Rich

http://blogs.msdn.com/b/gstemp/archive/2004/02/18/75600.aspx VBScriptから[名前を付けて保存]ダイアログを表示する方法を説明する方法があります。

http://www.eggheadcafe.com/software/aspnet/29155097/safrcfiledlg-has-been-deprecated-by-Microsoft.aspx によると、SAFRCFileDlgはMicrosoftによって非推奨になっていることに注意してください。

0
Nubok