Besoin d'aide cpp & flash

Signaler
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
23 octobre 2007
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
bonjour bonjour ^^


Cela va surement paraitre ridicule, mais il y deux ou trois trucs ou je sèche.


Je cherche à charger un flash (.swf) dans une fenêtre.


Puis tout simplement de communiquer avec mon prg c++ :)


Donc j'ai basé mon travail par rapport à cette excellente source :



http://www.cppfrance.com/codes/LECTEUR-ANIMATIONS-FLASH-100-API_33091.aspx


ou le chargement du swf se fait ici :


case WM_COMMAND:
   if( (HWND)lParam ==  hOuvrir)
   {
    // Déclarer et intialiser un buffer:
    char tampon[MAX_PATH];
    tampon[0]=0;
    // Déclarer une structure OPENFILENAME:
    OPENFILENAME ofn;
                // Mettre tous les membres de la structure à 0:
                memset( &ofn, 0, sizeof(OPENFILENAME) );
                // Définir les membres:
                ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWnd;
                ofn.lpstrFilter = "Animations Macromedia Flash\0*.swf\0\0";    
                ofn.lpstrFile = tampon;
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrTitle = "Choisir un fichier :";
                ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                // Lancer la boite de dialogue pour choisir un fichier:
                if(!GetOpenFileName(&ofn)) break;
    // Lire l'en-tête du fichier pour obtenir des infos sur l'animation:
    if(!LireEnTete(tampon,&swi))
    {
     // Afficher un message d'erreur quand le fichier n'est pas valide:
     MessageBox(hWnd,"\nLe fichier que vous avez tenté d'ouvrir n'est pas une animation Flash valide.","Lecteur d'animations Flash",0);
     break;
    }
    // Obtenir la version du composant ShockwaveFlash installé:
    long version;
    pIswf->FlashVersion(&version);
    if(swi.version>HIWORD(version))
    {
     // Afficher un message d'erreur quand la version de l'animation est plus récente que le composant installé:
     MessageBox(hWnd,"\nLa version de cette animation est plus récente que celle du composant installé.","Lecteur d'animations Flash",0);
     break;
    }
    // Appel de la fonction qui calcule la position et les dimensions du conteneur:
    RECT rct;
    PosDim(hWnd,swi.largeur,swi.hauteur,&rct);
    // Positionner le conteneur:
    MoveWindow(hConteneur,rct.left,rct.top,rct.right,rct.bottom,1);
    // Initialiser la couleur de fond de l'animation:
    pIswf->put_BackgroundColor(swi.fond);
    // Convertir le chemin en UNICODE:
    WCHAR fichier[MAX_PATH];
    MultiByteToWideChar (CP_ACP, 0, tampon, -1, fichier, MAX_PATH+1);
    // Charger et jouer l'animation:
    pIswf->put_Movie(fichier);
    break;
   }

Ici l'on peut seletionner le flash a charger.


Le truc c'est que je veut charger mon swf au lancement de la fenêtre (WM_CREATE) mais je n'y arrive pas :S


Ensuite si quelqu'un a quelques pistes pour la communication cpp / swf (du coté flash c'est fscommand() mais du côté cpp comment gère t'on ça ?)


Voilà, de bonnes question de noobs quoi (je suis une bille en api :) )


Merci d'avance.


 


 

6 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Pour adapter le code source mentionné à tes propres besoins, il suffit de bien en comprendre le fonctionnement. Pour cela, il faudra apprendre, progressivement, un peu sur la programmation des composants COM en plus des bases de l'utilisation des APIs Windows et du C/C++.
Pour l'adapter à ton cas,  il y'aura assez de lignes de code à déplacer pour les mettre à la fin du traitement de WM_CREATE. Il faudra aussi mettre quelques variables en global pour les rendre accessibles partout dans le code. Pour éviter la boite de dialogue du choix du fichier, tu peux mettre le chemin directement dans le tampon.
Mets ceci en global:
// Définir type de pointeur pour la fonction AtlAxAttachControl:
typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**); // Déclarer notre pointeur de fonction :
PAttachControl AtlAxAttachControl;

Mets ce bout de code à la fin du traitement de WM_CREATE:
            // Créer notre conteneur:
            hConteneur=CreateWindow("STATIC","",WS_CHILD | WS_VISIBLE ,0,0,0,0,hWnd,0,0,0);
            // Initialiser la librairie COM:
            CoInitialize(0);
            // Créer une instance de l'interface IShockwaveFlash:
            CoCreateInstance(CLSID_ShockwaveFlash,0,CLSCTX_ALL,IID_IShockwaveFlash,(void**)&pIswf);
            // Attacher l'interface à notre conteneur:
            AtlAxAttachControl(pIswf,hConteneur,NULL);
            char tampon[MAX_PATH];
            lstrcpy(tampon,"d:\\projets\\lecteurflash\\exemple.swf");
            // Lire l'en-tête du fichier pour obtenir des infos sur l'animation:
            if(!LireEnTete(tampon,&swi))
            {
                // Afficher un message d'erreur quand le fichier n'est pas valide:
                MessageBox(hWnd,"\nLe fichier que vous avez tenté d'ouvrir n'est pas une animation Flash valide.","Lecteur d'animations Flash",0);
                break;
            }
            long version;
            pIswf->FlashVersion(&version);
            if(swi.version>HIWORD(version))
            {
                // Afficher un message d'erreur quand la version de l'animation est plus récente que le composant installé:
                MessageBox(hWnd,"\nLa version de cette animation est plus récente que celle du composant installé.","Lecteur d'animations Flash",0);
                break;
            }
            // Appel de la fonction qui calcule la position et les dimensions du conteneur:
            RECT rct;
            PosDim(hWnd,swi.largeur,swi.hauteur,&rct);
            // Positionner le conteneur:
            MoveWindow(hConteneur,rct.left,rct.top,rct.right,rct.bottom,1);
            // Initialiser la couleur de fond de l'animation:
            pIswf->put_BackgroundColor(swi.fond);
            // Convertir le chemin en UNICODE:
            WCHAR fichier[MAX_PATH];
            MultiByteToWideChar (CP_ACP, 0, tampon, -1, fichier, MAX_PATH+1);
            // Charger et jouer l'animation:
            pIswf->put_Movie(fichier);

N'oublie pas de remplacer le chemin par celui de ton fichier à charger au lancement.
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
23 octobre 2007

Tout d'abord merci pour ta réponse.

Le build se passe bien (vcpp express) mais juste avant l'execution :


Exception non gérée à 0x00000000 dans LecteurFlash.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Ca passe sans  problème chez moi (VC 2005 Express).
Essaie de déboguer le code pour déterminer la ligne qui cause l'erreur.

?
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
23 octobre 2007

alors :

L'execution s'arrête sur :
AtlAxAttachControl(pIswf,hConteneur,NULL);


avec les erreurs executions :
Exception de première chance à 0x00000000 dans LecteurFlash.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.
Exception non gérée à 0x00000000 dans LecteurFlash.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.

et les errereurs de build :

*CVTRES : fatal error CVT1100: ressource dupliquée. Type : RT_RCDATA, nom : ID_DLL, langage : 0x040C
*LINK : fatal error LNK1123: échec lors de la conversion en fichier COFF : fichier non valide ou endommagé
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
23 octobre 2007

toujour dans l'idée d'ouvrir un flash à l'exécution je suis tomber sur cette source :

#include <windows.h>


int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show) {
    MSG   msg={0};
    void* init = GetProcAddress(LoadLibrary("atl"),"AtlAxWinInit");
    _asm call init;
    CreateWindow("AtlAxWin", "c:\\WINDOWS\\Help\\Tours\\mmTour\\segment2.swf", WS_VISIBLE|WS_POPUP,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),0,0,0,0);
    while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
};

qui permetterais aussi d'ouvrir un swf. Cela me paraissais plus simple mais évidemment ça ne marche pas (ça aurait été trop beau ). Ya pas un moyen simple de charger un flash dans le style ?

quant à la solution proposé par racpp, on est plusieurs à avoir tester sur vc++ 6, vc++ express, devcpp, codeblock et rien n'y fait.

Je met tout de même mon implémentation au cas ou j'aurais fait une erreur :

// Les includes:
#include <windows.h>
#include "swf.h"
#include "flash.h"


// Déclarer un pointeur sur l'interface IShockwaveFlash:
IShockwaveFlash *pIswf;
// Déclarer le HWND de notre conteneur Activex en global:
HWND hConteneur;
// Définir type de pointeur pour la fonction AtlAxAttachControl:
typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
// Déclarer notre pointeur de fonction :
PAttachControl AtlAxAttachControl;

et le wm_create :

case WM_CREATE:
   // Créer tous les controles:
   hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hWnd,0,0,0);
   hLire=CreateWindow("BUTTON","Lire",WS_CHILD | WS_VISIBLE,170,428,90,20,hWnd,0,0,0);
   hArret=CreateWindow("BUTTON","Arrêter",WS_CHILD | WS_VISIBLE,270,428,90,20,hWnd,0,0,0);
   hRembob=CreateWindow("BUTTON","Rembobiner",WS_CHILD | WS_VISIBLE,370,428,90,20,hWnd,0,0,0);
   hQuitter=CreateWindow("BUTTON","Quitter",WS_CHILD | WS_VISIBLE,520,428,90,20,hWnd,0,0,0);   
   hCadre1=CreateWindow("BUTTON","",BS_GROUPBOX | WS_CHILD | WS_VISIBLE,15,415,600,37,hWnd,0,0,0);
   hCadre2=CreateWindow("STATIC","",SS_SUNKEN | SS_CENTER | WS_CHILD | WS_VISIBLE,0,0,632,420,hWnd,0,0,0);
   
   // Créer notre conteneur:
            hConteneur=CreateWindow("STATIC","",WS_CHILD | WS_VISIBLE ,0,0,0,0,hWnd,0,0,0);
            // Initialiser la librairie COM:
            CoInitialize(0);
            // Créer une instance de l'interface IShockwaveFlash:
            CoCreateInstance(CLSID_ShockwaveFlash,0,CLSCTX_ALL,IID_IShockwaveFlash,(void**)&pIswf);
            // Attacher l'interface à notre conteneur:
            AtlAxAttachControl(pIswf,hConteneur,NULL);
            char tampon[MAX_PATH];
   lstrcpy(tampon,"c:\\exemple.swf");
            // Lire l'en-tête du fichier pour obtenir des infos sur l'animation:
            if(!LireEnTete(tampon,&swi))
            {
                // Afficher un message d'erreur quand le fichier n'est pas valide:
                MessageBox(hWnd,"\nLe fichier que vous avez tenté d'ouvrir n'est pas une animation Flash valide.","Lecteur d'animations Flash",0);
                break;
            }
            long version;
            pIswf->FlashVersion(&version);
            if(swi.version>HIWORD(version))
            {
                // Afficher un message d'erreur quand la version de l'animation est plus récente que le composant installé:
                MessageBox(hWnd,"\nLa version de cette animation est plus récente que celle du composant installé.","Lecteur d'animations Flash",0);
                break;
            }
            // Appel de la fonction qui calcule la position et les dimensions du conteneur:
            RECT rct;
            PosDim(hWnd,swi.largeur,swi.hauteur,&rct);
            // Positionner le conteneur:
            MoveWindow(hConteneur,rct.left,rct.top,rct.right,rct.bottom,1);
            // Initialiser la couleur de fond de l'animation:
            pIswf->put_BackgroundColor(swi.fond);
            // Convertir le chemin en UNICODE:
            WCHAR fichier[MAX_PATH];
            MultiByteToWideChar (CP_ACP, 0, tampon, -1, fichier, MAX_PATH+1);
            // Charger et jouer l'animation:
            pIswf->put_Movie(fichier);
   
   break;
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Je veux juste rappeler que le code source que tu as mentionné a été fait avec Visual C++ 6. Il marche aussi parfaitement sous Visual C++ 2005 Express. Quant à Dev C++ ou CodeBlock, cela ne marche pas car ces outils souffrent de beaucoup de lacunes.
Comme je disais plus haut, avec un minimum de connaissances sur l'utilisation des composant COM (Activex) et le langage C++, tu arriveras à adapter le code et le faire fonctionner avec Visual C++ 2005 Express. C'est juste une question de temps.
Bon courage.