Comunidad de diseño web y desarrollo en internet online

Problema al mandar variables desde C# a Flash AS3

Citar            
MensajeEscrito el 15 Ene 2008 05:00 pm
Hola:

Estoy trabajando en una aplicacion flash en AS3 y para efectos de bases de datos y otras cosas que el flash no puede hacer decidi cargar la movie sobre un programa en C#.

Luego de muchos problemas con las dll que se necesitan para que el asunto funcione, logre cargar la pelicula, pero el problema llego cuando intente mandar datos desde el C# al flash.
Estoy usando la funcion SetVariable, que supuestamente modifica el valor de una variable existente en el flash, pero luego de ejecutar el metodo SetVariable el valor de la variable de flash no cambia. Sin embargo, si uso GetVariable para recuperar el valor de la variable que habia seteado desde C# me aparece el valor que habia definido antes con SetVariable, pero si uso GetVariable sin haber hecho SetVariable antes me da el siguiente error: "Devuelto error HRESULT E_FAIL de una llamada a un componente COM."

Alguien sabe como hacer que el flash reciba los datos que le estoy enviando??

Por ElierGosu

3 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Mar 2008 06:23 pm
Yo tambien estoy trabajando en un proyecto que requiere interoperabilidad entre C# y flash asi que te voy a decir algunos tips, que espero te sirvan.

Antes de empezar estuve buscando mucha info para saber cual era la mejor forma de hacerlo, y encontré, en la pagina de Adobe Flash, una librería bastante simple de usar, hecha en C#, que actua como un proxy para comunicarte con flash. No necesitas usar el GetVariables ni nada por el estilo.

La libreria la podes descargar desde acá:
http://livedocs.adobe.com/flash/9.0/main/samples/Programming_ActionScript3.0_samples.zip (Viene con codigo fuente y todo ^^ )
Dentro de este zip hay un proyecto llamado ExternalInterfaceProxy.csproj. La ruta es Samples/IntrovertIM_CSharp/ExternalInterfaceProxy/ExternalInterfaceProxy.csproj

Para comunicarte con flash tenes dos formas:
1) Llamar a una funcion de flash desde .Net invocando a una funcion de la clase ExternalInterfaceProxy:

Código :

      //C#
      public object Call(string functionName, params object[] arguments)
recibe un array de objects y se encarga de convertir la llamada en un xml que el flash entiende y puede decodificar.
2) Atender llamadas de flash agregando un handler al evento de la clase ExternalInterfaceProxy:

Código :

      //C#
      public event ExternalInterfaceCallEventHandler ExternalInterfaceCall


Con respecto al error que te sale:
A mi me sucedió lo mismo (incluso despues de estar utilizando el proxy), pero lo pude solucionar. Este mismo error me saltó en dos oportunidades:
1) Cuando desde .Net intentaba invocar a una funcion de flash "funcionX" y me habia olvidado de agregar un handler en flash para esa funcion. Esto se hace así

Código :

      //ActionScript
      ExternalInterface.addCallback("funcionX", this, funcionX);

2) O bien, cuando no me habia olvidado nada, pero por alguna cuestión de multithreading (donde no tengo nada que ver), yo estaba invocando a una "funcionX" cuando, al parecer, todavia no se habia ejecutado el codigo de flash que registraba los handlers.
Esto ultimo lo solucioné poniendo un flag en C# que indicaba si el proxy estaba listo para ser usado o no. Este flag se ponia en true cuando recibía una llamada desde Flash que decia que se habian terminado de agrergar todos los handlers. Esta llamada estaba hecha a mano en el archivo flash/actionscript mas o menos así:

Código :

      //ActionScript
      import flash.external.ExternalInterface;
      _root.onLoad=function(){
         ExternalInterface.addCallback("miFuncion1", this, miFuncion1);
         ExternalInterface.addCallback("miFuncion2", this, miFuncion2);
         if(ExternalInterface.available){
            ExternalInterface.call("NotifyLoaded", this );
         }
      }
      function miFuncion1(){
      }
      function miFuncion2(arg1:String, arg2:Number){
      }

Este es el codigo que llama al proxy

Código :

      //C#
      public class GraphicLayer{
         private ExternalInterfaceProxy _proxy=null;
         private bool _ExternalInterfaceEnabled=false;
         
           public GraphicLayer(ExternalInterfaceProxy proxy) {
               _proxy = proxy;
               _proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(External_OnExternalInterfaceCall);
           }
   
         public object External_OnExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e)
           {
               switch (e.FunctionCall.FunctionName)
               {
               
                   case "NotifyLoaded":
                       this._ExternalInterfaceEnabled = true;
                  break;
               
               } 
            return null;
           }
         protected void CallExternalFunction(string functionName, object[] args) {
               if (this._ExternalInterfaceEnabled ) {
                   _proxy.Call(functionName, args);
               }
           }
         
      }


Espero que te sirva!
Si no entendiste algo, me explique mal, o simplemente necesitas mas información no dudes en consultarme.

Saludos
NahuelGQ

Por NahuelGQ

0 de clabLevel



 

opera
Citar            
MensajeEscrito el 19 Feb 2009 03:37 am
En alguna ocasión había publicado una respuesta de esto, solo que es utilizando Fscommand, pero tiene los pasos para meter tu swf en tu winform


jacobocho escribió:

Hola, 3 años tarde pero bueno, siempre es útil saber como integrar proyectos de Flash con c# .net ya que no siempre se tiene disponible un webserver o bien si queremos que flash pueda guardar archivos, base de datos etc. solo hay que integrarlo a un WINFORM y el se encargará de todo esto (ejemplo un elearning que se distribuye por CD)

Crea un nuevo proyecto en VStudio.NET, depués donde esta la barra de herramientas (textbox, Radiobutton, etc), selecciona "Add/Remove Items", después selecciona "COM Components", buscas "Shockwave Flash Object".

Español - en el "Cuadro de Herramientas" haz click derecho y haz click en "Agregar o Quitar Elementos". Luego de eso ve a la solapa que dice Objetos COM y selecciona el que dice Shockwave Flash Object, una ves que se importe lo arrastras a tu forma de c#

Aparecera el "Shockwave Flash object" en tu barra de herramientas y arrastralo a tu WinForm como cualquier otro componente

NOTA: En las versiones nuevas de visualStudio puede haber un problema al hacer este proceso, "The type or namespace name 'AxShockwaveFlashObjects' could not be
found (are you missing a using directive or an assembly reference?)", creo que la solucion está en copiar DLL anteriores en la carpeta "obj\Debug" del proyecto (Interop.ShockwaveFlashObjects.dll y AxInterop.ShockwaveFlashObjects.dll, así como en la de "bin\Debug" reemplazando la que generó el pryecto al intentar hacer los pasos anteriores

si tu componente se llama "axShockwaveFlash1" en el evento Load del form ponemos lo siguiente:
EN C#

Código :


private void Form1_Load(object sender, EventArgs e)
        {
            this.axShockwaveFlash1.Movie = "Path_Completo_de_tu_swf.swf";
            this.axShockwaveFlash1.FSCommand += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEventHandler(this.axShockwaveFlash1_FSCommand);
        }

//Agregamos el evento que se ejecuta en el FSCommand
//Este evento se dispara cada que hacemos Fscommand
private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
        {
            switch (e.command)
            {
                    case "accion1:"
                        MessageBox.Show("Argumento: " + e.args);
                         //ACCIONES A EJECUTAR CON C#
                        break;
            }

     }



EN CASO DE FLASH

Código :


on (release) {

      fscommand("accion1","Cualquier texto a enviar");
}

Por jacobocho

6 de clabLevel



 

msie
Citar            
MensajeEscrito el 26 Sep 2011 05:24 pm
¿Considerando que el Kinect se comunica con c# de manera nativa, es posible utilizar el primer método que comento NahuelGQ? .

Intentaré probarlo ya que hasta ahora he venido comunicando el flash con kinect a través de un proceso que es kinect + c# + node.js + Flash(as3) este método me ha funcionado pero me ha dado un delay que molesta.

Por luisdecopas

5 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 09 Nov 2016 07:22 pm
Hola. aunque el tema ya es algo viejo, espero puedan ver mi mensaje.

estoy trabajando con visual.net y as3.

y exactamente tengo el mismo problema. que al mandar llamar la funcion desde visual me marca Devuelto error HRESULT E_FAIL de una llamada a un componente COM.

he intentado utilizar los codigos que ustedes mencionan pero me sigue marcando el mismo error.

es muy diferente para .net 2008?

Por mega_2611

0 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.