Flash(Flex)の、ExternalInterface.objectID が、Google Chrome で取得できなかったのですが トラブル
昨日、2010年10月31日に対応してました。ほんと、びっくりしてしまいました。 もともと、Flash の問題として発生していたみたいなんですが、えらい迷惑です。 [FP-383] ExternalInterface.objectID がセットされていません。 昨日のテストでは、IE や Firefox では発生せずに、Google Chrome で起こります。 ( Flash は、10,1,85,3 ) 仕方無いので FlashVars を併用する事にしていますが、ここ最近の問題は それだけでは無く、Firefox のみ、Flash(Flex) で呼び出した JavaScript の関数内で、alert を実行するとフリーズするという現象です。 昨日、古いPC の Opera でも発生したので全ての処理で、 setTimeout("alert('文字列')", 10 ); に書き換える必要がありそうです。
// *********************************************************
// 汎用型 クリップボードコピー用 Flash ボタン
// *********************************************************
package {
import flash.display.*;
import flash.events.*;
import flash.external.*;
import flash.system.*;
import flash.net.*;
// 表示用クラス 【Sprite】を継承
public class flashButton extends Sprite {
[Bindable]
[Embed("button.gif")]
private var imgButton:Class;
private var strid:String;
// *********************************************************
// コンストラクタ
// *********************************************************
public function flashButton():void {
// IE:Object の id,それ以外 Embed の name
strid = ExternalInterface.objectID;
if ( strid == null ) {
strid = stage.loaderInfo.parameters.objid;
}
// Firebug 用
// ExternalInterface.call("console.log", strid );
// stage の設定
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
// マウスイベント取得用
var eventArea:Sprite = new Sprite();
eventArea.x = 0;
eventArea.y = 0;
eventArea.buttonMode = true; // ハンドカーソル
addChild(eventArea);
var imgPath:String = ExternalInterface.call( "orgCodeInit", strid );
if ( imgPath == null || imgPath == "" ) {
// デフォルトのボタン画像
var myImg:Bitmap = new imgButton();
myImg.x = 0;
myImg.y = 0;
eventArea.addChild(myImg);
}
else {
var loader:Loader = new Loader();
loader.load(new URLRequest(imgPath));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
function ():void {
eventArea.addChild( loader );
}
);
}
eventArea.addEventListener(MouseEvent.CLICK,
function(ev:flash.events.MouseEvent):void {
// Firebug 用
// ExternalInterface.call("console.log", strid );
var shift_flg:String;
var ctrl_flg:String;
if ( ev.shiftKey ) {
shift_flg = "1";
}
else {
shift_flg = "0";
}
if ( ev.ctrlKey ) {
ctrl_flg = "1";
}
else {
ctrl_flg = "0";
}
var str:String =
ExternalInterface.call(
"orgCodeGetForClipcopy",
strid,
shift_flg,
ctrl_flg
);
// 戻された文字列に何か入っていたら
// クリップボードにコピーして再び呼び出す
if ( str != null && str != "" ) {
System.setClipboard(str);
ExternalInterface.call("orgCodeClipcopyEnd" );
}
}
);
}
}}

そもそも、これがしたかっただけなのですが、XP の MSG コマンドは、Windows2000 には無いし、
どうも使い勝手が良く解りませんでした。
ただ、自分のPC では通常 Net Send する必要も無いので Messenger サービスを停止しているので、
Net Send するほうからサービスを起動するのに WSH の WshRemote( DCOM ) を使おうとすると
いろいろ壁が立ちふさがっていました。
まず、Windows XP では、WshRemote のインストールが Microsoft の問題でされていないと言う
事で、それをインストールする為に、wscript -regserver という隠しコマンドみたいなのを実
行しなくてはなりません。これでやっと登録されます。
dcomcnfg を実行して、一番左のウインドウを表示させて、マイコンピュータで
右クリックしてプロパティを表示後順にダイアログを開けてチェックします。
これで双方から WshRemote( DCOM ) が実行可能となります。この設定はどうや
ら Windows2000 には無いようなのですが、実際のところは良く解りません。
また、Firewall が動いている場合はさらに、WshRemote で実行するアプリケーシ
ョンの登録が必要だと思いますが、Firewall が必要な環境でわざわざするような
内容では無いし、仮に必要だとしてもそれなりの技術者だろうから問題は無いでし
ょう。自分の環境ではここまでです。たぶん XP 同士でもこれでうまく行くと思い
ます(調べたかぎりでは Windows XP のお話だったので)。
あとは、Windows7 のテストですが、それは明日以降です。
実行したコードは以下のようになります。
(Microsoft のサンプルのまま)
