基本的にはセキュリティの問題からNGになってます。
が、自作のActiveXコントロールを作成し、IEのセキュリティの設定を甘くすれば可能です。
現実問題かなり限定された環境でしか利用できないのが現実です。
つーか、CEで使用するのが自分の主目的ですのでOKだったりしますが。
また、XPの環境であれば、実行ファイル形式でパブリッシュすれば何の問題なくローカルアプリを起動できますからわざわざセキュリティを甘くする必要は無いでしょう。
ただし、直接実行できるアプリは特定のフォルダに無いといけないので任意のアプリを起動する場合は、1段噛ませる必要はありますけど。
どちらの方法でも、Flash側は「Fscommand」を使用します。
詳細は、ヘルプを確認してください。
が、自作のActiveXコントロールを作成し、IEのセキュリティの設定を甘くすれば可能です。
現実問題かなり限定された環境でしか利用できないのが現実です。
つーか、CEで使用するのが自分の主目的ですのでOKだったりしますが。
また、XPの環境であれば、実行ファイル形式でパブリッシュすれば何の問題なくローカルアプリを起動できますからわざわざセキュリティを甘くする必要は無いでしょう。
ただし、直接実行できるアプリは特定のフォルダに無いといけないので任意のアプリを起動する場合は、1段噛ませる必要はありますけど。
どちらの方法でも、Flash側は「Fscommand」を使用します。
詳細は、ヘルプを確認してください。
○FlashのActiveScriptは、↓の用に書きます。
オブジェクトでの埋め込み、実行形式ともにOKです。
○ActiveX作成方法
MSDNの解説 ←のリンクを参考にプロジェクトを作成してメソッドを追加します。
ほとんどがスケルトンで出来上がります。あんど、ウイザードで出来ます。
プロジェクトを作成する時の設定でチェック項目を変更します。
今回作成するコントロールは描画を行いませんのでそのあたりを抑制します。
・セキュリティ設定対策
コンストラクタの自動で生成されるコメントに書いてあるとおりに値を設定するとIEのセキュリティ設定を変更しなくても実行されるようになります。
・レジストリ登録関係
MSDNの解説2←ActiveXが登録されたときにレジストリの情報が追加されますがそれに関連する情報
stdafx.hで、_CE_DCOMをundefするのもありです。(CEだけだと思いますが。)
・XPの場合
regsvr32.exeを使用して登録してください。
・CEの場合
regsrvce.exeを使用して登録してください。
eVC++かVisualStudio2005に付属されています。
○HTMLの用意
Flashがパブリッシュ時に吐き出したHTMLを使用します。
通常は、
GUIDは適宜書き換えてください。
Flashが吐き出しソースの一部とJScriptのソースです。
○IEの設定
・XPの場合
インターネットオプション→セキュリティ→カスタム
→「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」
を、有効にする。
・CEの場合
インターネットオプション→セキュリティ→ローカルイントラネット
→「安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」
を、有効にする。
おそらく、以上の情報でなんとかなると思いますが不足分はがんばってください。
<Category : Flash>
オブジェクトでの埋め込み、実行形式ともにOKです。
HogeHoge.onPress = function() {
fscommand("exec","アプリのパス");
};○ActiveX作成方法
MSDNの解説 ←のリンクを参考にプロジェクトを作成してメソッドを追加します。
ほとんどがスケルトンで出来上がります。あんど、ウイザードで出来ます。
プロジェクトを作成する時の設定でチェック項目を変更します。
今回作成するコントロールは描画を行いませんのでそのあたりを抑制します。
//ウイザードで追加される関数
//HTMLのJScriptから呼び出される
VARIANT_BOOL CActiveXtestCtrl::Run(VARIANT &path)
{
//HTMLのJScriptから呼び出される
VARIANT_BOOL CActiveXtestCtrl::Run(VARIANT &path)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: ここにディスパッチ ハンドラ コードを追加してください。
WCHAR path_w[MAX_PATH+1];
//データをコピー
if(path.vt == VT_BSTR){
} // TODO: ここにディスパッチ ハンドラ コードを追加してください。
WCHAR path_w[MAX_PATH+1];
//データをコピー
if(path.vt == VT_BSTR){
_tcscpy(path_w,path.bstrVal);
//MessageBox(path_w);
ExecuteProcess(path_w,NULL,NULL,0);
return VARIANT_TRUE;
}else{//MessageBox(path_w);
ExecuteProcess(path_w,NULL,NULL,0);
return VARIANT_TRUE;
return VARIANT_FALSE;
}・セキュリティ設定対策
コンストラクタの自動で生成されるコメントに書いてあるとおりに値を設定するとIEのセキュリティ設定を変更しなくても実行されるようになります。
//コンストラクタ
CActiveXtestCtrl::CActiveXtestCtrl()
{
CActiveXtestCtrl::CActiveXtestCtrl()
{
// TODO: 必要に応じて、プロパティ m_dwCurrentSafety および m_dwSupportedSafety に適切な値を設定してください。
// 実際のシナリオによって INTERFACESAFE_FOR_UNTRUSTED_DATA か INTERFACESAFE_FOR_UNTRUSTED_CALLER、
// または両方の場合があります。
m_dwCurrentSafety = 0;
m_dwSupportedSafety = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
//↑の設定を行うとセキュリティの設定でActiveXが無効でも実行されるようになる。
InitializeIIDs(&IID_DActiveXtest2, &IID_DActiveXtest2Events);
// TODO: この位置にコントロールのインスタンス データの初期化処理を追加してください。
}// 実際のシナリオによって INTERFACESAFE_FOR_UNTRUSTED_DATA か INTERFACESAFE_FOR_UNTRUSTED_CALLER、
// または両方の場合があります。
m_dwCurrentSafety = 0;
m_dwSupportedSafety = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
//↑の設定を行うとセキュリティの設定でActiveXが無効でも実行されるようになる。
InitializeIIDs(&IID_DActiveXtest2, &IID_DActiveXtest2Events);
// TODO: この位置にコントロールのインスタンス データの初期化処理を追加してください。
・レジストリ登録関係
MSDNの解説2←ActiveXが登録されたときにレジストリの情報が追加されますがそれに関連する情報
stdafx.hで、_CE_DCOMをundefするのもありです。(CEだけだと思いますが。)
#undef _CE_DCOM //afxRegFreeThreadingを使用するように変更
//DLLの登録時にレジストリを登録してくれる関数
BOOL CActiveXtestCtrl::CActiveXtestCtrlFactory::UpdateRegistry(BOOL bRegister)
{
#ifndef _CE_DCOM
if (bRegister)
}
作成後は、BOOL CActiveXtestCtrl::CActiveXtestCtrlFactory::UpdateRegistry(BOOL bRegister)
{
#ifndef _CE_DCOM
int nRegFlags = afxRegFreeThreading;//こっちが採用されないと動作しない。
#else
int nRegFlags = afxRegApartmentThreading;
#endif // !_CE_DCOMif (bRegister)
return AfxOleRegisterControlClass(
else
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_ACTIVEXTEST2,
IDB_ACTIVEXTEST2,
nRegFlags,
_dwActiveXtest2OleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
m_clsid,
m_lpszProgID,
IDS_ACTIVEXTEST2,
IDB_ACTIVEXTEST2,
nRegFlags,
_dwActiveXtest2OleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
・XPの場合
regsvr32.exeを使用して登録してください。
・CEの場合
regsrvce.exeを使用して登録してください。
eVC++かVisualStudio2005に付属されています。
○HTMLの用意
Flashがパブリッシュ時に吐き出したHTMLを使用します。
通常は、
var objWShell = new ActiveXObject("WScript.Shell")
を使用するのですが、CEではWSHが無くて使用できないので下記のタグを使用してActiveXをロードします。GUIDは適宜書き換えてください。
<OBJECT classid="clsid:8BF1CE6A-XXXX-40D1-85EE-70DBA29B4F3A" id=ActiveXtest></OBJECT>
Flashが吐き出しソースの一部とJScriptのソースです。
<script language="JavaScript">
<!--
var isInternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
// Flash コマンドですべての FSCommand メッセージを処理する
function InfoTerminalPresent_DoFSCommand(command, args) {
// Internet Explorer をフックするコード
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
//-->
</script>
<!--
var isInternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
// Flash コマンドですべての FSCommand メッセージを処理する
function InfoTerminalPresent_DoFSCommand(command, args) {
var InfoTerminalPresentObj = isInternetExplorer ? document.all.InfoTerminalPresent : document.InfoTerminalPresent;
//
// コードをここに配置します。
//
if(command == "exec"){
}//
// コードをここに配置します。
//
if(command == "exec"){
ActiveXtest.Run(args);//ここでActiveXのバイナリコードを呼び出す。
//alert("End : " + command + " + " + args);
}//alert("End : " + command + " + " + args);
// Internet Explorer をフックするコード
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
document.write('<script language=\"VBScript\"\>\n');
document.write('On Error Resume Next\n');
document.write('Sub InfoTerminalPresent_FSCommand(ByVal command, ByVal args)\n');
document.write(' Call InfoTerminalPresent_DoFSCommand(command, args)\n');
document.write('End Sub\n');
document.write('</script\>\n');
}document.write('On Error Resume Next\n');
document.write('Sub InfoTerminalPresent_FSCommand(ByVal command, ByVal args)\n');
document.write(' Call InfoTerminalPresent_DoFSCommand(command, args)\n');
document.write('End Sub\n');
document.write('</script\>\n');
//-->
</script>
○IEの設定
・XPの場合
インターネットオプション→セキュリティ→カスタム
→「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」
を、有効にする。
・CEの場合
インターネットオプション→セキュリティ→ローカルイントラネット
→「安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」
を、有効にする。
おそらく、以上の情報でなんとかなると思いますが不足分はがんばってください。