LECTEUR D'ANIMATIONS FLASH (100% API)

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 5 août 2005 à 22:30
Leucistic Messages postés 61 Date d'inscription mercredi 24 septembre 2008 Statut Membre Dernière intervention 16 juin 2012 - 24 nov. 2009 à 11:37
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33091-lecteur-d-animations-flash-100-api

Leucistic Messages postés 61 Date d'inscription mercredi 24 septembre 2008 Statut Membre Dernière intervention 16 juin 2012 1
24 nov. 2009 à 11:37
Bonjour,

Tout d'abord merci pour cette source très très bien codée et commentée.
J'ai essayé de le compiler avec Code::Blocks 8.02 et il me met les messages d'erreur suivant :

262|undefined reference to `_CoInitialize@4'|
264|undefined reference to `_CoCreateInstance@20'|
277|undefined reference to `_CoUninitialize@0'|

Est-ce que vous savez comment résoudre ce problème ???
Merci d'avance
cs_gm55 Messages postés 4 Date d'inscription mercredi 8 juillet 2009 Statut Membre Dernière intervention 31 juillet 2009
31 juil. 2009 à 12:40
d'ailleurs la définition du conteneur n'a plus lieu d'être

donc la ligne HWND hConteneur; est inutile.
cs_gm55 Messages postés 4 Date d'inscription mercredi 8 juillet 2009 Statut Membre Dernière intervention 31 juillet 2009
31 juil. 2009 à 12:33
// OPOS1000.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#import"C:\\Program Files\\Posiflex Inc\\Posiflex OPOS Control\\LineDisp\\OPOSLineDisplay.ocx"\
rename("CreateWindow", "CreateWindov")

OposLineDisplay_1_8_Lib::IOPOSLineDisplay *m_opos;

const GUID CLSID_IOPOSLineDisplay = {0xccb90102,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};
const GUID IID_IOPOSLineDisplay = {0xccb94101,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};

HWND hConteneur;

int main(int argc, char* argv[])
{
HRESULT res = 5;
short a = 10;
LPCTSTR DeviceName = "LD demo";

CoInitialize(0);
CoCreateInstance(CLSID_IOPOSLineDisplay,0,CLSCTX_ALL,IID_IOPOSLineDisplay,(void**)&m_opos);

res = m_opos->get_DeviceEnabled(&a);
printf("get()_DeviceEnabled() : %d\n",res);

res = m_opos->Open(DeviceName);
printf("Open() : %d\n",res);
res = m_opos->ClaimDevice(300);
//res = m_opos->put_DeviceEnabled(TRUE);
//res = m_opos->DisplayText("abc", 0 );
//res = m_opos->DisplayTextAt(1,0,"abc", 0 );

return 0;

}
je penses avoir réussi à ne pas le mettre dans un conteneur. En tout cas ça marche sous une application console.
C'est pas le même activex qu'avant mais en fait c'est celui que je voulais utilisé mais il avait un petit défaut de redéfinition de la fonction createwindow que j'ai réussi à corriger.
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008
31 juil. 2009 à 12:07
Si tu veux le rendre invisible à l'écran, tu peux toujours le mettre dans une fenêtre de dimensions 0x0.

Tu auras le son et pas la vidéo par exemple..
cs_gm55 Messages postés 4 Date d'inscription mercredi 8 juillet 2009 Statut Membre Dernière intervention 31 juillet 2009
31 juil. 2009 à 12:00
Bonjour, en fait j'ai fini par réussir j'avais pas vu qu'il fallait utiliser un using name space dans le fichiers . tlh. Ce qui fait que maintenant je suis arrivé à appeler directement l'interface importé et donc ça marche beaucoup mieux.

Juste question il n'y a aucun moyen d'importer l'activex sans l'insérer dans une fenêtre ?

Merci
cs_gm55 Messages postés 4 Date d'inscription mercredi 8 juillet 2009 Statut Membre Dernière intervention 31 juillet 2009
30 juil. 2009 à 09:50
Bonjour,

J'ai essayé de faire la même chose effectuée pour ShockwaveFlash avec le controle activex que je souhaite utiliser.
Malheureusment, même si j'ai finit à obtenir un code qui compile il n'a pas l'air d'appeller l'activex.

Je vous met le code obtenu sous visual c++ :
j'importe l'ativex, je met les clsid et iid correspondants. Pour l'instant j'ai créé une interface avec quelques fonctions reprenant celle d'ole viewer (mis en commentaire).
La différence avec le code exposé c'est que pour permettre la compilation je suis obligé d'importer l'activex.

#import"C:\\Program Files\\Posiflex Inc\\Posiflex OPOS Control\\CashDwr\\OPOSCashDrawer.ocx"

const GUID CLSID_IOPOSCashDrawer = {0xccb90042,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};
const GUID IID_IOPOSCashDrawer = {0xccb92041,0xb81e,0x11d2,{0xab,0x74,0x00,0x40,0x05,0x4c,0x37,0x19}};

interface IOPOSCashDrawer : public IDispatch
{
public:
virtual HRESULT STDMETHODCALLTYPE get_DeviceEnabled(BOOL* pDeviceEnabled) = 0;
//[id(0x00000011), propget, helpstring("property DeviceEnabled")]HRESULT DeviceEnabled([out, retval] VARIANT_BOOL* pDeviceEnabled);

virtual HRESULT STDMETHODCALLTYPE Open(LPCTSTR DeviceName, long* pRC) = 0 ;
//[id(0x00000025), helpstring("method Open")] HRESULT Open([in] BSTR DeviceName, [out, retval] long* pRC);

};

HWND hConteneur;
IOPOSCashDrawer *pIswf;

Aprés j'ai repris le code sans charger la dll zlib car je ne penses pas qu'elle me soit utile. J'ai juste effectué les modifications suivantes

// Créer notre EDIT 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:
HRESULT res = CoCreateInstance(CLSID_IOPOSCashDrawer,0,CLSCTX_ALL,IID_IOPOSCashDrawer,(void**)&pIswf);
res = AtlAxAttachControl(pIswf,hConteneur,0);

Ensuite j'ai juste gardé de la fonction WndProc
case WM_CREATE:
// Créer tous les controles:
hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hWnd,0,0,0);
break;

case WM_COMMAND:
if( (HWND)lParam == hOuvrir)
{res pIswf->get_DeviceEnabled(&a); // int a 10;//res pIswf->Open(DeviceName, &b); // HRESULT res 5;
}

avec get_DeviceEnabled a reste inchangé et res prend pour valeur -2147467263 donc ça ne fonctionne pas vraiment
avec open j'obtiens une erreur à l'exécution qui quitte le programme

Voilà si quelqu'un pouvait m'aider ça serait sympa.
je précise que j'ai déjà utiliser cet activex avec les MFC donc je connais en partie son fonctionnement et ses méthodes mais j'ai maintenant besoin de l'utiliser sans.

Merci
Utilisateur anonyme
25 janv. 2009 à 00:52
Thanks, good job ;)
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 avril 2008 à 20:58
Je ne sais pas si Miquel75 dit vrai ou non, je ne connais pas les ATL, mais j'ai rarement vu autant d'arrogance. Ca serait bien plus constructif si tu fournissait les liens usenet dont tu parles depuis le début, et si tu essayais d'expliquer ton point de vue.
Pour la Q192560 elle doit dater de plus de 2 ans (2 septembre 2005 est la date de dernière mise à jour)
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
17 avril 2008 à 19:26
Voici le lien de la Q192560:
http://support.microsoft.com/?scid=kb%3Ben-us%3B192560&x=11&y=16
A noter qu'elle date du 02/09/2005 alors que ma source est postée presque 1 mois avant.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
17 avril 2008 à 19:20
miquel75 >> La tu continues de prouver que tu ne sais pas de quoi tu parles. victorcoasne a raison car DEV C++ ne supporte pas les projets ATL. Ces derniers sont une exclusivité VC++ tout comme les MFC. Manipuler les objets OLE/COM et leurs interfaces n'est pas forcément de l'ATL.
Je viens de jeter un coup d'oeil sur la Q192560, et là je retrouve ce à quoi je m'attendais. C'est à dire, du code spécifique aux ATLs de VC++. Ca n'a rien à voir avec mon code. Il suffit de faire une petite comparaison pour s'en convaincre. La démarche est totalement différente.
Je n'ai pas besoin de chercher sur Usenet car c'est à toi de le faire et nous fournir les liens pour nous apporter les preuves de tes dires. Si tu ne peux pas apporter ces preuves, ça veut dire qu'il n'y'en a pas.
Et pour finir, puisque tu crois comprendre mieux que tous les autres, pourquoi tu ne nous fais pas, au moins un code source pour nous apprendre à programmer?
Miquel75 Messages postés 41 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 23 avril 2009
17 avril 2008 à 15:18
> Le code source compile ! Donc c'est pas des ATL.

Alors, celle-là, je l'archive !
Hallucinant.
Miquel75 Messages postés 41 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 23 avril 2009
17 avril 2008 à 15:17
Oui, il faut bien comprendre de quoi on parle, savoir ce qu'est un OLE container client,
comment sont implémentées IOleClientSite ou IOleInPlaceSite, ce qu'est un appel dynamique ou statique, etc... bref les bases COM et autres.
Certaines réponses ci-dessus dénotent une grande puérilité.
Les exemples MSDN ATL, publiés depuis 11 ans dans le SDK, sont évidemment basés sur la Q192560,
alors ressortir la même chose en croyant avoir inventé la roue...
Et si en plus on ne sait pas chercher sur Usenet ou désassembler une DLL par W32Dasm...
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
17 avril 2008 à 15:03
Miquel75> J'utilise Dev-C++ et j'ai jamais utilisé les ATL.
Le code source compile ! Donc c'est pas des ATL.
Il se sert d'une DLL mais code le programme en API !
Je suis impatient de voir sa source vu que tu sais apparemment ce que c'est que "pomper".
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 avril 2008 à 23:14
Salut shuttleur,
Je pense que cette fonctionnalité doit être implémentée dans l'Activex. Ce dernier envoie un événement à une interface (ou classe) implémentée dans le code du projet contenant la fenêtre mère. Jette un coup d'oeil sur mon code de Navigateur Web dans lequel j'intercepte les événements générés par l'activex WebBrowser.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 avril 2008 à 22:23
miquel75 >> Avant de mettre des commentaires ici, il serait préférable de commencer par bien se documenter pour comprendre les termes et les notions dont on parle. Sinon, on ne parlerait pas le même langage. Essaie aussi d'argumenter tes propos. Tu peux pas donner les liens MSDN et Usenet?
Miquel75 Messages postés 41 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 23 avril 2009
15 avril 2008 à 16:09
C'est donc bien 100% ATL comme je notais et comme les exemples MSDN dont c'est pompé.
La classe de fenêtre non documentée est incluse dans Windows et fait tout l'OCX embedding nativement (postée sur Usenet)
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008
15 avril 2008 à 14:55
Salut racpp !

Je me suis très inspiré de tes sources sur les conteneurs activeX en win32, et te remercie d'avoir partagé cette trouvaille.

Cette technique me permet d'inclure dans une ihm en win32 un activeX "reader" de vidéos développé par un collègue.

Je cherche en ce moment à capturer l'evènement WM_NCHITTEST de l'activeX dans la procédure de ma fenêtre container. Saurais-tu si je dois modifier qqch dans l'activeX ou s'il y a une astuce pour que la fenètre mère aie une notification d'un évènement de l'activeX ?

Merci d'avance.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2008 à 11:36
"complètement bidon, vu que c'est 0% API..."
Défaut d'optique, erreur de source lue ou incompréhension des termes employés ???
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
27 mars 2008 à 23:18
miquel75 >> Il parait que tu ne connais pas la différence entre API et ATL. Ce dernier est un type de projet à part dans Visual C/C++. Mon code est donc 100% API et 0% ATL car il ne fait qu'utiliser les fonctions API exportées par atl.dll dans un projet Win32 API. Les exemples fournis par MSDN sont tous en ATL et utilisent une classe de fenêtre spéciale ATL. Je ne connais pas la "classe de fenêtre non documentée donnée sur les Newsgroups de prog Windows". Fais nous un code source pour nous faire découvrir cette nouvelle classe de fenêtre. On te remerciera beaucoup.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 mars 2008 à 15:36
Tu peux en dire plus?
Miquel75 Messages postés 41 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 23 avril 2009
24 mars 2008 à 13:31
Malheureusement, complètement bidon, vu que c'est 0% API, puisque 100% ATL (exemples ATL complets dans MSDN)
Alors qu'on peut le faire 100% api, avec la classe de fenêtre non documentée donnée sur les Newsgroups de prog Windows.
cs_NeoUmbrella Messages postés 104 Date d'inscription vendredi 5 novembre 2004 Statut Membre Dernière intervention 11 septembre 2008
9 nov. 2007 à 00:15
Fonctionne impécablement bien, même pour les animations flash hebergées sur un serveur distant.
Très bon travail, comme la plupart de tes codes-sources.
Merci bien RACPP.
cs_thomas007 Messages postés 1 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 17 octobre 2006
17 oct. 2006 à 14:10
Bonjour,

tout d'abord merci pour ce code. Une petite note toutefois, j'ai utilisé cette methode dans un projet pour jouer de nobreuses animations flash et il y a un "memory leak" suite au bug suivant portant sur les atl: http://support.microsoft.com/kb/258235/EN-US/
10/10 tout de même.
cs_hakim0 Messages postés 123 Date d'inscription mercredi 27 août 2003 Statut Membre Dernière intervention 12 août 2008 1
16 août 2006 à 12:50
Ok Merci.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
15 août 2006 à 16:32
Salut,
hakim0 >> Désolé pour le retard. "flash.h" est fait à partir des infos fournies pas l'outil OLE/View. Ces infos ont été écrites manuellement dans ce fichier. "swf.h" contient l'implémentation de quelques fonctions utilisées par le programme.
pour la conversion, tu peux faire petit outil simple qui fait cette conversion. C'est simple:
{ D27CDB6E AE6D 11CF 96 B8 44 45 53 54 00 00}
{0xD27CDB6E,0xAE6D,0x11CF,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}};
cs_hakim0 Messages postés 123 Date d'inscription mercredi 27 août 2003 Statut Membre Dernière intervention 12 août 2008 1
5 août 2006 à 12:49
une autre question:
comment on peut convirtire le clsid {D27CDB6E-AE6D-11CF-96B8-444553540000} EN {0xD27CDB6E,0xAE6D,0x11CF,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}};
cs_hakim0 Messages postés 123 Date d'inscription mercredi 27 août 2003 Statut Membre Dernière intervention 12 août 2008 1
3 août 2006 à 20:27
j'ai une question,
ou tu trouve le fichier flash.h est swf.h?
est pour d'autre controle par exemple ms flexgrid et datagrid ou on peu trouve ces ficier la .h ??
cs_fuliculi Messages postés 43 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 3 mai 2010 6
1 mars 2006 à 16:15
Sympa ce code, mais j'ai un problème dès que je veux utiliser les autres méthodes comme GetVariable, j'ai un gros message d'erreur.
visionor Messages postés 1 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 1 octobre 2005
1 oct. 2005 à 23:02
moi aussi je te remercie, je cherche ce type de source depuis longtemps!!!
Je t'Aime!
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
28 août 2005 à 17:03
Merveilleuse source! 10/10
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 août 2005 à 14:15
salut,
Le défaut peut venir du compilateur Dev-C++ et ça peut venir aussi de l'Activex Flash. Peut-être qu'il comporte une faille que Visual sait corriger automatiquement. J'èspère un jour arriver à découvrir la cause de ce disfonctionnement. Tout est question de temps. En attendant, je vais essayer de teser le maximum d'Activex avec Dev-C++, comme ça je saurai si le problème vient du compilateur ou non.
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
10 août 2005 à 12:22
Bonjour,

Je te comprends et je suis sûr que tu serais encore plus content si tu arrivais à trouver pourquoi sous Dev-C++ on y arrive pas alors que les autres activeX de ta part fonctionnent (Navigateur, MediaPlayer)

Bon courage et bonne continuation,

Sincèrement,@++
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 août 2005 à 02:09
Merci beaucoup vecchio56. C'est très encourageant, surtout après les heures que j'ai passées à concevoir manuellement le fichier "flash.h" à partir des données fournies pas "OLE Viewer". Données que j'ai ensuite dû corriger à cause d'erreurs dans quelques définitions. Correction faite après installation de de la version 5 de Flash Activex à la place de la 7. J'allais plusieurs fois abandonner le projet jusqu'au jour où un membre pose une question à ce sujet dans le forum. Je lui ai donné ma parole et je n'avais plus le droit de tout laisser tomber. Merci à lui aussi. Ca fait toujours plaisir de savoir qu'on a apprécié notre travail. Ca fait oublier toutes les peines qu'on a vécues pour le réaliser. Merci encore.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 août 2005 à 20:56
Géniale comme source, ca marche nickel, je mets 10
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 août 2005 à 19:58
Salut,
Avec Dev-C++ le programme refuse toujours d'exécuter la fonction AtlAxAttachControl(). l'appel à la fonction se fait mais sans jamais en sortir = plantage.
Ca marche bien avec les autres Activex mais avec Flash c'est impossible. Je vais essayer de trouver une solution quand j'aurai du temps. Je pense qu'il reste encore des choses à améliorer dans Dev-C++. Avec Visual 6, tout fonctionne sans problème.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 août 2005 à 02:08
Ca y est, j'ai fait marcher le débogueur. Le programme s'arrête à la ligne où on appelle la fonction de la "atl.dll" => res =AtlAxAttachControl(pIswf,hConteneur,NULL);
Tout était normal avant l'appel de cette fonction. ça m'intrigue. Je vais voir.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 août 2005 à 01:45
Je viens d'installer Dev-C++. J'ai Créé le projet. Pour les deux warnings, il suffit d'aller dans le fichier "flash.h" sur les lignes indiquées puis taper ENTREE. Pour le reste c'est vrai que ça n'affiche que la fenêtre. Je dois donc deboguer sous Dev-C++ mais le débogage ne se lance pas. Chaque fois que j'appuie sur le bouton de débogage une messagebox me dit qu'il faut recompiler le code. Même en cliquant "ok" rien ne se passe. Y'a t-il un truc à paramètrer?
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 août 2005 à 00:44
Je vais voir ça après avoir installé Dev-C++. :)
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
8 août 2005 à 11:54
Bonjour,
Des warning pas méchant (il suffit de rajouter une ligne vide en fin de fichier):
In file included from LecteurFlash.cpp:3:
swf.h:144:110: warning: no newline at end of file
In file included from LecteurFlash.cpp:4:
flash.h:187:7: warning: no newline at end of file

Ce qui m'inquiète c'est que le programme quand il est lancé, j'ai beau ouvrir puis lire, arrêter, rembobiner, lire, arrêter, ouvrir, lire...... rien ne s'affiche (à part le fond traditionnel des contrôles Windows.

Je suis sous Dev-C++.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 août 2005 à 22:30
J'ai oublié de préciser que la dll est sous forme de ressource dans l'exécutable. Si ce dernier ne la trouve pas à son lancement, il l'installe dans le même répertoire.