Acabo de hacer un proyecto en donde requería utilizar interacción entre flash y asp.net
Busqué un poco por la web pero sólo encontré soluciones para utilizar un control flash en una aplicación ejecutable (Forms).

Entonces vi una forma de comunicar flash con javascript mediante el comando fscommand de flash. La verdad que es muy fácil, sin embargo necesitaba mandar información desde mi página hacia flash, cosa que ya no hacia el fscommand (tal vez sí pero no tan fácil). Así que busqué una alternativa y leí un poco sobre la librería external de flash que permite enviar y recibir información entre flash y javascript.

La forma de hacer esto es simple:

En el archivo fla debemos importar flash.external.ExternalInterface. Y luego tan sólo añadimos un callback para recibir información o call para enviarla.


// esto es en actionscript 2.0
import flash.external.ExternalInterface;

ExternalInterface.addCallback("sendToFlash", this, doStuff);

function doStuff(myArg:String){
  var hey:String = "Got your message!";
  trace("param: " + myArg);
  ExternalInterface.call("comesFromFlash", hey);
}

Y en javascript declaramos la función sendToFlash (o como queramos llamarle)


// esto es en javascript
var isIE7 = navigator.userAgent.indexOf("MSIE 7") != -1;
var isIE = (navigator.appName.indexOf("Microsoft") != -1) && !isIE7;

function getFlashMovie(movieName) {
  return isIE ? window[movieName] : document[movieName];
}

function callAFlashFunction() {
  getFlashMovie('myFlash').sendToFlash('yeeey');
}

function comesFromFlash(msg) {
  alert(msg);
}

Y listo, podemos hacer que al pulsar un botón se mande a llamar a la función callAFlashFunction.

Pero habíamos dicho que lo que quería era interacción con asp.net cierto? Bueno pues tan simple como hacer un postback para que el servidor procese la respuesta.


// esto también es javascript
function comesFromFlash(msg) {
  //alert(msg);
  __doPostBack('Form1', msg);
}

function __doPostBack(eventTarget, eventArgument) {
  var theForm = isIE ? window['Form1'] : document['Form1'];

  if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
    theForm.__EVENTTARGET.value = eventTarget;
    theForm.__EVENTARGUMENT.value = eventArgument;
    theForm.submit();
  }
}

' Ahora esto es en VB.NET
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  If IsPostBack Then
    someLabel.text = Request.Params.Get("__EVENTARGUMENT")
  End If
End Sub

Como se puede entender, al recibir información desde flash hacemos un postBack para que esta información pueda ser manipulada en el servidor. Logicamente tenemos que tener un form en la página con los campos ocultos __EVENTARGUMENT y __EVENTTARGET.

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="400" id="myFlash">
  <param name="allowScriptAccess" value="sameDomain" />
  <param name="movie" value="myMovie.swf" />
  <param name="menu" value="false" />
  <param name="quality" value="high" />
  <param name="bgcolor" value="#ffffff" />
  <embed src="myMovie.swf" menu="false" quality="high" bgcolor="#ffffff" width="400" height="400" name="myFlash" align="middle" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

<form id="Form1" runat="server">
  <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
  <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

  <asp:Label ID="someLabel" runat="server" Text=""></asp:Label>
  <input type="button" value="Hablar con Flash" onclick="callAFlashFunction(); return false;" />
</form>

Ahora los puntos importantes son:

  • Colocar el objeto flash FUERA del formulario! (esto me causó dolores de cabeza porque si está dentro del form causa errores en IE).
  • 2) Asignar el atributo id en la etiqueta object y name en la etiqueta embed.

El error que se da en el punto uno si no se satisface, es en las funciones __flash__addCallback(instance, name) y/o __flash__removeCallback(instance, name) que genera flash.

Por último… sí, este es un post técnico… y no, no apoyo a microsoft pero esto me lo pidieron en el trabajo asi que lo hago con actitud positiva y ahora puedo decir que sé algo que antes no sabía.