miércoles, septiembre 01, 2010

Integrar un objeto Flash en una Form de C#

En un proyecto que tengo en manos tuve que integrar una animación SWF de Flash en una ventana (form) de Visual C# 2010. Para hacerlo, los pasos que todo mundo sigue son:

- Ir al menú de Herramientas (toolbox)
- Dar click derecho y seleccionar Elegir elementos (Choose items)
- Dar click en la pestaña COM Components
- Activar la opción Shockwave Flash Object y Aceptar

- Regresar al menú de Herramientas y seleccionar el nuevo elemento agregado
- Dibujar un rectángulo en la form que albergará el objeto Flash
- En el código C# agregar las siguientes líneas:
axShockwaveFlash1.LoadMovie(0, Application.StartupPath + "\\anima.swf");
axShockwaveFlash1.Play();
- Las cuales sirven para cargar un archivo SWF y reproducirlo.

Suena sencillo, pero en mi equipo no me dejaba insertar el objeto Flash y me arrojaba muchos errores. Creo que debe ser porque estoy usando Windows 7 x64 y porque en esta versión ya no viene incluido el ActiveX 'flash.ocx'.

Para solucionarlo encontre esta excelente guía:
http://blog.sharpstyle.com/2007/03/28/flash-ocx-control-and-visual-studio-2005-issues/

En la cual detallan que para integrar el objeto Flash a un equipo necio como el mío hay que extraer un par de DLLs del archivo flash.ocx. Para seguir los pasos tuve que usar mi laptop con Windows XP que sí tiene flash.ocx correctamente instalado. Extraje los DLLs conforme a la guía y para integrarlos en mi PC seguí estos pasos.

- Desinstala cualquier versión de Flash que tengas instalada y reinstala la última versión. Aquí puedes descargar Flash Player Offline Installer 10i.

http://www.4shared.com/file/TWHaH-6I/flash_player_offline_installer.html

- Descarga el paquete de DLLs y OCX de Flash 10 de aquí, usa la contraseña electrolinks.blogspot.com

http://www.4shared.com/file/a8ZYmJNT/DLL_OCX_Flash.html
- Copia todos los archivos a la carpeta de tu proyecto, no hace falta que estén en la carpeta bin. Los más importantes son:
AxShockwaveFlashObjects.dll
ShockwaveFlashObjects.dll
- Ve al menú Proyecto, Agregar referencias, pestaña Examinar y luego selecciona la primer DLL.
- Repite los pasos para la segunda DLL.

Si aún C# no te permite dibujar el objeto, debes borrar el elemento Shockwave Flash Object del menú herramientas y volverlo a agregar abriendo el archivo Flash10c.ocx adjunto en el paquete de arriba.

Si aún así el objeto se dibuja mal o te arroja errores, prueba reiniciando tu PC.

Y si aún así todo sale mal, tendrás que cargar el objeto sin usar el diseñador, con puro código:

AxShockwaveFlash axShockwaveFlash = new AxShockwaveFlash();
axShockwaveFlash.Location = new System.Drawing.Point(50, 50);

this.Controls.Add (axShockwaveFlash);
//this.Show(); // Avoids InvalidActiveXStateException.

axShockwaveFlash.Movie = "D:\\test.swf";
//* it is important to set Size after specifying Movie property
//* if Size is specified before, it is ignored
axShockwaveFlash.Size = new System.Drawing.Size(20, 20);
axShockwaveFlash.Play();

Después de varias pruebas y errores logré echarlo a andar. Espero que alguno de estos tips resuelvan tu problema.

Actualización: al intentar ejecutar mi compilación de Win7 en WinXP la carga del Flash falló brutalmente. Tuve que recompilar mi aplicación en WinXP e instalar Flash 10 ActiveX y con ello ya funcionó.

2 comentarios:

Unknown dijo...

Necesito hacer algo parecido a lo que implementaste pero en mi caso la pelicula de flash tiene que regresar información al C# pra que se refleje en mi base de datos y viceversa. Se te hace que se pueda implementar o la vez muy dificil. Estaba pensando en usar xml para intercambiar información. Básicamente el usuario necesita modificar visualmente un template, como si fuera un rompecabezas y salvarlo en sQL server, cuando ingrese nuvamente se tiene que cargar la información desde la bd con los últimos cambios. Cualquier comentario al respecto es bienvenido. Slds.

MigSantiago dijo...

Hola. Para enviar mensajes de Flash a C# y viceversa yo he usado este tutorial.

http://j.mp/aLGXwj

Gracias por visitar el blog.