Bonjour à tous
Voilà je travaille sur le code en C++ du lecteur Media Player Classic, Projet guliverkli, en licence GPL sur le site SourceForge.
Sur ce code j essaie d'ajouter la détection des évènements FScommand venant de l'objet ShockwaveFlash mais je n y arrive pas.
Alors FScommand est une commande sous flash qui permet de d'envoyer des donnée au programme externe qui héberge l'OLE Flash, du genre MPC le lecteur multi-media, ou la page web sous IE, Mozilla.
Sur un projet MFC générer par VC++, j arrive à implémenter de la détection de FSCommande, en ajoutant le contrôle Flash sur l'interface et faissant add event handler -> FSCommand. VC++ me génère ce code:
FSCommandShockwaveflash1 est la fonction qui est déclenché à chaque FSCommand.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void CAppDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_SHOCKWAVEFLASH1, m_flash); } ... ... BEGIN_EVENTSINK_MAP(CAppDlg, CDialog) ON_EVENT(CAppDlg, IDC_SHOCKWAVEFLASH1, 150, FSCommandShockwaveflash1, VTS_BSTR VTS_BSTR) END_EVENTSINK_MAP() // Appellé par les fscommand du flash void CAppDlg::FSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) { }
C'est ce que j essaie de faire avec la version de MPC qui génère l objet flash dynamiquement et qui n a pas d'ID dédié à l'objet Flash.
J ai quelques pistes que j ai testé mais sans succés par manque de connaissance sur le domaine de l'OLE.
D'abord comme on a pas d'ID pour le controle Flash, j'ai pensé à faire ca:
Puis y a aussi l'utilisation de l'objet COleControl pour récupèrer les messages d'évènements. Mais je n'ai aucune connaissance là dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 BEGIN_EVENT_MAP( CShockwaveFlash, CWnd) EVENT_CUSTOM_ID( "FScommand", 150, OnFSCommand, VTS_BSTR VTS_BSTR ) END_EVENT_MAP() void CShockwaveFlash::OnFSCommand (LPCTSTR command, LPCTSTR args) { if (strcmp(command, "message")==0) //traitement message }
Les informations que l'on récupère grâce au OLE/COM viewer:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 // Generated .IDL file (by the OLE/COM Object Viewer) // // typelib filename: Flash8b.ocx [ uuid(D27CDB6B-AE6D-11CF-96B8-444553540000), version(1.0), helpstring("Shockwave Flash"), custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 100663657), custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1135111210), custom(DE77BA65-517C-11D1-A2DA-0000F8773CE9, Created by MIDL version 6.00.0361 at Tue Dec 20 12:40:09 2005 ) ] library ShockwaveFlashObjects { // TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} importlib("stdole2.tlb"); // Forward declare all types defined in this typelib interface IShockwaveFlash; dispinterface _IShockwaveFlashEvents; interface IFlashFactory; interface IFlashObjectInterface; interface IDispatchEx; interface IServiceProvider; [ odl, uuid(D27CDB6C-AE6D-11CF-96B8-444553540000), helpstring("Shockwave Flash"), dual, oleautomation ] interface IShockwaveFlash : IDispatch { ... ... }; [ uuid(D27CDB6D-AE6D-11CF-96B8-444553540000), helpstring("Event interface for Shockwave Flash"), hidden ] dispinterface _IShockwaveFlashEvents { properties: methods: [id(0xfffffd9f)] void OnReadyStateChange(long newState); [id(0x000007a6)] void OnProgress(long percentDone); [id(0x00000096)] void FSCommand( [in] BSTR command, [in] BSTR args); [id(0x000000c5)] void FlashCall([in] BSTR request); }; [ uuid(D27CDB6E-AE6D-11CF-96B8-444553540000), helpstring("Shockwave Flash") ] coclass ShockwaveFlash { [default] interface IShockwaveFlash; [default, source] dispinterface _IShockwaveFlashEvents; };
Donc si un développeur sait comment faire ou sait où sont mes erreurs, je lui serais très reconnaissant
Et aussi ceux qui peuvent m'éclairer un peu plus sur le domaine de l'OLE.
Merci![]()
Partager