プロが教える店舗&オフィスのセキュリティ対策術

Flashのactionscriptを使ってAccessなどの外部アプリケーションファイルを起動することはできないのでしょうか?

A 回答 (1件)

先日,


「質問:WEBブラウザの重複起動の禁止」
で回答した者です。


今回のご質問は Web上で Flash を使うのではなく,
ローカルPCで使用し,なおかつ,
Windows + IE + Accessをインストールしている環境で使用する
と考えてよろしいでしょうね。
また,
起動させたいのは 「外部アプリケーション "ファイル"」 ですよね。


ActionScript 単独では不可能です。

とにかく,Flash というものは,
そういうアブナイこと(アブナイことに発展する可能性があること)はできないように作られています。

Flash 5 までのバージョンでは,
「外部アプリケーション "ファイル"」 の起動ではなく,
「外部アプリケーション」 の起動まででしたら,
なんとかプロジェクタ(exe)ファイルに書き出せば,
fscommand の exec で制約付きで起動できましたが,
Flash MX 以降はそれすらほとんど不可能になりました。

「Flash プロジェクタで fscommand "exec" 使用時の注意点」
http://www.adobe.com/jp/support/flash/ts/documen …

先日の「質問:WEBブラウザの重複起動の禁止」よりは,
ずっと 「アブナクない」 ご質問だとは思いますが,
それでもまだFlash にとってはアブナイことです。
質問者さまには不服かもしれませんが,
この 「アブナイことをしないFlash」 だからこそ,
FlashPlayerの普及率がものすごく高いのです。



ActionScript 単独では不可能ですが,
「外部アプリケーションファイル」 を関連付けられたソフトで開くのには,
先日のご質問にあった,WSH での VBS と組み合わせれば一応できることはできます。
HTML に記述された VBS の プロシージャ を,
その HTML に貼り付けた SWF から叩けば良いのです。


例として,
ドライブC の直下に「test」というフォルダを作成し,
そこに「db1.mdb」というAccessのファイルを保存してみました。
つまり 「C:\test\db1.mdb」 を作成したということです。


そして,任意のフォルダに,「任意の名前.html」を作成します。
これは,Flashを貼り付ける前段階のテスト検証です。

---「任意の名前.html」-------------------------
<html>
<head>
<script language="VBScript">

Sub RunProgram
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "file:///C:/Program%20Files/Microsoft%20Office/Office10/MSACCESS.EXE c:\test\db1.mdb"
End Sub

</script>
</head>
<body>

<button onclick="RunProgram">Run Program</button> <p>

</body>
</html>
-------------------------------------


私の場合 Access は,
C:\Program Files\Microsoft Office\Office10\MSACCESS.EXE
にありますから,
「db1.mdb」を開くアプリケーション(MSACCESS.EXE)のパスは上のようなファイルパスになります。

このパスは人によって違うと思いますから,
当然 Web ではこのまま使えませんし,
その前にボタンクリックで VBScript を実行しようと思えば,
「ActiveXコントロールの警告ダイアログ」が出ますから,
当然 Web で使うべきものではありません。


- - - ちょっと余談 - - - - - -
MDB ファイル自体は,
キュリティなども高いローカルにおけるデータベースファイルの王者みたいのもので,
何かの形でどの PC でも使われている可能性が高いですが,
たいていそれを使うためのデータベースソフトと一体となっていて,
普通は,そのソフトで使うデータファイルなので,
実際は Access なんてソフトは普通の人は持ってません。

ですから,Web上では普通,閲覧用には置いていませんね。
まぁ,Web上ではほとんど全く使い物になりません。
Access のバージョンなども考慮すると,
1%くらいの人なら使用可能かもしれません。
したがって,
作成中のFlashも内々でローカルPCで使う物だと推測しました。
- - - - - - - - - - - - - - - - - -


上の HTML に,
Flash の SWF ファイルを貼り付けて,
HTML のボタンではなく,Flash のボタンで VBScript を実行すれば良いわけです。

Flash でボタンを作成し,
そのボタンには,例えば次のように書きます。

------------------------------------
on (release) {
fscommand ("Access", "c:\\test\\db1.mdb");
}
------------------------------------

Access がコマンドで,c:\\test\\db1.mdb がその引数です。
Access がコマンドだと言っても,
勝手に Access という文字列にしただけで何でもかまいません。
単なる引数の一種だと考えれば良いと思います。
Flash の作成はこれだけです。非常に簡単です。

この説明サンプルでは,
「fscom.swf」 というファイル名で SWF ファイルをパブリッシュします。
また,「fscom.swf」 は 横幅200px,高さ100px で作成したとしておきます。
この 「fscom.swf」 を貼り付ける HTML は次のようにします。

---「任意の名前.html」-------------------------
<HTML>
<HEAD>
<TITLE>fscom</TITLE>

<script language="VBScript">

Sub fscom_FSCommand(ByVal command, ByVal args)
If command = "Access" Then
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "file:///C:/Program%20Files/Microsoft%20Office/Office10/MSACCESS.EXE " & args
End If
End Sub

</script>

</HEAD>
<BODY bgcolor="#FFFFFF">

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ID=fscom WIDTH=200 HEIGHT=100>
<PARAM NAME=movie VALUE="fscom.swf">
<PARAM NAME=quality VALUE=high>
<EMBED src="fscom.swf" quality=high WIDTH=200 HEIGHT=100 swLiveConnect=true NAME=fscom TYPE="application/x-shockwave-flash"></EMBED>
</OBJECT>

</BODY>
</HTML>
-------------------------------------


VBScript のプロシージャ(サブルーチン)名は何でも良いわけではなく,
 「Flashの名前_FSCommand」
と決められています。
上の場合,fscom_FSCommand です。
この fscom は,
OBJECT タグ内の 「ID=fscom」 と,
EMBED タグ内の 「NAME=fscom」に合わせてください。

プロシージャ(サブルーチン)名は1つに決められているので,
上の場合,「Access」 というコマンドの引数によって,
 If command = "Access" Then
のように分岐するようにしておけば,
そのコマンド名によって,動作するスクリプトを選ぶことができます。

上のような説明を見るより,
実際に作ってみて実感するしか理解はできないと思います。

直接の参考にはならないかもしれませんが,
一応ここまでの参考URLです。

「Hey, Scripting Guy!」
http://www.microsoft.com/japan/technet/scriptcen …

「Flashからのコマンドを受け取りサブウィンドウを開く」
http://www.openspc2.org/reibun/JS_TipsAndTricks/ …



しかしまだ,
「ActiveXコントロールの警告ダイアログ」問題が残っています。

これは IE を使う上ではどうしようもないことです。
それだけ アブナイ ことをしようとしていると言うことです。
それを自覚した上で,
「任意の名前.html」の拡張子を変えてやります。

「任意の名前.html」変更→「任意の名前.hta」
手動で html を hta に変えるだけです。
この「任意の名前.hta」をダブルクリックで開いて,
Flash のボタンをクリックすると,
「ActiveXコントロールの警告ダイアログ」は出ずに,
「db1.mdb」が開きます。
「任意の名前.hta」の HTA とは,「HTMLアプリケーション」 という意味のファイルです。
中身は HTML でも,拡張子を変えるだけで,ちゃんとしたアプリケーションファイルとして Windows では扱われるようになります。

「Google検索 HTA Flash」
http://www.google.com/search?hl=ja&q=HTA+Flash&lr=

ここまでで書いたサンプルの作成&動作検証環境は次の通りです。

 OS:Windows 2000 SP4
 ブラウザ:IE5.5
      (プラグイン Flash Player 9)
 Flash:Flash 5,Flash 8
 Access:Microsoft Access 2002 SP-2

環境が全体的に古いですが,
この検証に使用した PC は結構ハイスペックです。
日頃の動作検証などのため,わざと古いバージョンで止めてある部分もあります。
Accessが入っているPCはこれだけですので,
他の環境では動作検証していません。


- - - - - - - - - - - - - - - - - -

と言う感じで,
Flash では ActionScript と VBScript と連携させて実現させるわけですが,
Flash はハッキリ言ってそういうことに非常に不向きです。



Flash はWeb上の単独アプリケーションや,
サーバサイドのシステム,PHP や CGI などと組み合わせて使うのが一番ですし,
元からそう言う風に設計されています。

PHP や CGI などは本来 GUI なインターフェイスを持ちません。
そこで,HTML(Hyper Text Markup Language) をはき出したり,
Flash に変数を送信して,
GUI(グラフィカルユーザインタフェース) としてブラウザに結果を表示させるわけですが,
HTML は普通,見た目静止しています。
また,ブラウザによって見え方が違います。
見た目を重視するなら,GUIな部分は インタラクティブな Flash の方が良いでしょう。
また,当然単独でも動作します。
そう言った点が評価されて,Flash の今の地位があるのです。

PHP や CGI に限らず,
マルチメディアコンテンツの再生などでも,Flash は欠かせない存在になってきていますね。

Flash はエンドユーザーに一番近い場所にいる,
信頼された通信の窓口です。
その窓口が,Access だの Excel だの,
その他危険なソフトをパカパカ開きだしたら終わりです。
信用丸つぶれ。Adobe 大赤字。

もちろん Access や Excel のファイル自体がアブナイわけではありません。
しかしアブナイ可能性は十分持っていますね。
私もファイル操作やファイル書きかえなどの VBA はしょっちゅう作りますし,
それ自体危険行為だとも思っていません。
しかし何でもできてしましますね。
ファイルの移動,書きかえ,抹消…
やろうとは思いませんが,システムファイルの削除や書きかえもしようと思えば簡単にできます。
アブナイ可能性を十分秘めています。


ですから ActionScript では,
Accessファイルの起動などということは元からできませんし,
今後もできるようにはならないと思います。
したがって,
ローカルで使うアプリケーションとして使うのは非常に不向きです。

※唯一,Flash単体でファイルの書きかえや保存ができるのが,
  SharedObject の sol ファイルです。
  唯一これだけです。


なお,私はよくわからないことですが,
Flash 8 以降では,
ExternalInterface クラス というものができて,
これを使用すると,JavaScript と ActionScript との間,
または ActionScript と、VisualBasic や Visual C++ などの ActiveX コントロールに対応した他のプログラム との間の通信機能が向上するらしいです。

というわけで,
気になったので参考URL
(と言っても Flash 8 のヘルプですが)。

「External API について」
http://livedocs.macromedia.com/flash/8_jp/main/0 …
>> メモ
>> この機能は、HTML ページやコンテナアプリケーションとの
>> 相互動作用の古い機能 fscommand() に代わるものです。
>> 同じ状況であれば、External API の方が
>> fscommand() よりも確実に機能します。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
先日に続いて、また無知な私に丁寧に教えていただき本当にありがたいです。

今回も、あぶない事をしようとしていたようですね。
fscomandについては実際にやってみましたが、うまく動作しなかったのですが、こういうわけだったんですね。

教えていただいた事を利用して、もっと勉強していきたいと思います。
ありがとうございました。

お礼日時:2006/11/30 11:04

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