(最近AS3用にs.h.log: C#2.0+AS3.0 – XMLSocketCommandというのを作ったので、こっち推奨です)

C#.NETの中にActiveX ObjectのFlash.ocxを埋め込んで、連携させるのはよくやる手なんだけど、Flash.ocx←→C#間の通信がクセのある仕様(SetVariable, fscommand)なので便利にするクラスを作ってみた。

・変数1個の送受信

・C#のArrayListとFlashのArrayの交換

ができる。

sample project(VS2005)

OcxConnector.as(for Flash)

SwfConnectorLib.cs(for C#)

SwfConnector

中央の白い所だけがFlash。上下はC#のForm

FlashのStringの扱いの弱さもあって、配列はまとめて1000個ぐらいまでが限度みたい。俺の環境では2000個送ると固まる。

1要素あたりの文字数にもよると思うけど。

■C#からFlashにデータを送る

axSWFという名前でShockWaveFlashObjectがFormに配置されているとして

usingSwfConnectorLib;

SwfConnectorconnector=newSwfConnector(axSWF,”_root.connector”);

connector.SendData(stringstr);

■FlashでC#からデータを受け取る

_rootにconnectorという名前でOcxConnectorクラスが配置されないと通信できない(C#側のコンストラクタにも注意)

importOcxConnector;

varconnector:OcxConnector=newOcxConnector();

connector.setFunc_onRecvData(onRecvData);

// コールバック

functiononRecvData(recvData:String){

trace(recvData);

}

コールバック関数を登録しておくと、受信した時に受け取れる



■FlashからC#にデータを送る

stringが送れる

connector.sendData(data:String);

■C#でFlashからデータを受け取る

こっちも、受信は関数名をコールバックに追加する

connector.onRecvDataFunc+=onRecvData;

publicvoidonRecvData(AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvente)

{

Console.WriteLine(e.command + “, ” + e.args);

}

fscommand形式。e.argsの中にデータが入っている。e.commandは”connector.senddata”と書かれているはず

■配列の送受信

配列も同様。StringではなくC#側がArrayList, Flash側がArrayになる。

C#側での受信はfscommandではなくArrayListです

C#からの送信時に、ArrayListの中のObjectのToString()を読んでいるので、そこに適当に工夫すると複雑なデータ構造も送れるかもしれないですね。C#にクラス自身の持つメンバ変数名一覧を取得する機能があったら実装するんだけどね。

■参考 Flash.ocxと.NETの連携

sappari.org – C#の中にFlashを埋め込む

—Shockwave Flash Object—|プログラマーって呼ばないで!

VB+Flash その2 VBからFlashへ値を送る|プログラマーって呼ばないで!

Macromedia – Developer Center : Embedding Macromedia Flash Player in a C# Application to Display Stock Information

Example: Using the External API with an ActiveX container