ActiveX : comment accéder aux méthodes de MediaPlayer 7.0 ou 8.0 ??

ActiveX : comment accéder aux méthodes de MediaPlayer 7.0 ou 8.0 ?? - Programmation

Marsh Posté le 04-01-2002 à 11:09:24    

Voilà mon problème, j'aimerai par l'intermédiaire de Director (ou VB, ou VC) accéder aux méthodes du Media Player 7.0 ou 8.0 tel que le positionnement du curseur, etc... ça marche très bien avec media player 6.4 mais ce dernier ne réponds pas assez rapidement aux commandes à cause du buffering sur le disque dur.
C pourquoi il faut absoluement que j'utilise Media Player 7.0 ou 8.0 mais celui-ci n'apparait pas dans la liste des ActiveXs disponibles sous Director ou tout autre applics pouvant importés des activeXs.  
Lorsque l'on essaie de l'encapsuler en VB on est bloqué car on a pas encore une fois accès aux méthodes de l'activeX (on a uste les fonctions de base comme "Play" ou "Stop" mais rien en ce qui concerne le placement du curseur, etc...)
 
Merci d'avance de vos réponses.

Reply

Marsh Posté le 04-01-2002 à 11:09:24   

Reply

Marsh Posté le 04-01-2002 à 11:36:24    

je viens de voir es infos sur le site de microsoft:
 
"Windows Media Player 7.1 does not support embedding the control in any applications
 that use Microsoft Visual Basic or Visual C++ through IDispatch. Also, version 7.1
 does not support a Netscape Navigator plug-in. For these reasons, both the 6.4 and
 7.1 versions of the control are installed when the end-user installs Windows Media
 Player. The new control and the old control have different ClassID numbers, different
 object models, and different sets of functionalities."
 
 
quand je clique sur le lien "objet media player 7.1" (  
http://msdn.microsoft.com/library/ [...] object.asp )
j'obtiens 3,4 méthodes avec 4,5 propriétés ne me permettant justement pas de faire ce que je veux contrairement à l'
objet media player 6.4 (  
http://msdn.microsoft.com/library/ [...] erence.asp )

Reply

Marsh Posté le 04-01-2002 à 12:27:15    

j'ai trouvé ça sur le forum:
 
 
 
"// Dispatch interfaces referenced by this interface
class CMediaPlayerDvd;
 
//////////////////////////////////////////////////
 
///////////////////////////
// CMediaPlayer2 wrapper class
 
class CMediaPlayer2 : public CWnd
{
protected:
DECLARE_DYNCREATE(CMediaPlayer2)
public:
CLSID const& GetClsid()
{
 static CLSID const clsid
  = { 0x22d6f312, 0xb0f6, 0x11d0, { 0x94, 0xab, 0x0, 0x80, 0xc7, 0x4c, 0x7e, 0x95 } };
 return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName,
 LPCTSTR lpszWindowName, DWORD dwStyle,
 const RECT& rect,
 CWnd* pParentWnd, UINT nID,
 CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }
 
   BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
 const RECT& rect, CWnd* pParentWnd, UINT nID,
 CFile* pPersist = NULL, BOOL bStorage = FALSE,
 BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
 pPersist, bStorage, bstrLicKey); }
 
// Attributes
public:
 
// Operations
public:
double GetCurrentPosition();
void SetCurrentPosition(double newValue);
double GetDuration();
long GetImageSourceWidth();
long GetImageSourceHeight();
long GetMarkerCount();
BOOL GetCanScan();
BOOL GetCanSeek();
BOOL GetCanSeekToMarkers();
long GetCurrentMarker();
void SetCurrentMarker(long nNewValue);
CString GetFileName();
void SetFileName(LPCTSTR lpszNewValue);
CString GetSourceLink();
DATE GetCreationDate();
CString GetErrorCorrection();
long GetBandwidth();
long GetSourceProtocol();
long GetReceivedPackets();
long GetRecoveredPackets();
long GetLostPackets();
long GetReceptionQuality();
long GetBufferingCount();
BOOL GetIsBroadcast();
long GetBufferingProgress();
CString GetChannelName();
CString GetChannelDescription();
CString GetChannelURL();
CString GetContactAddress();
CString GetContactPhone();
CString GetContactEmail();
double GetBufferingTime();
void SetBufferingTime(double newValue);
BOOL GetAutoStart();
void SetAutoStart(BOOL bNewValue);
BOOL GetAutoRewind();
void SetAutoRewind(BOOL bNewValue);
double GetRate();
void SetRate(double newValue);
BOOL GetSendKeyboardEvents();
void SetSendKeyboardEvents(BOOL bNewValue);
BOOL GetSendMouseClickEvents();
void SetSendMouseClickEvents(BOOL bNewValue);
BOOL GetSendMouseMoveEvents();
void SetSendMouseMoveEvents(BOOL bNewValue);
long GetPlayCount();
void SetPlayCount(long nNewValue);
BOOL GetClickToPlay();
void SetClickToPlay(BOOL bNewValue);
BOOL GetAllowScan();
void SetAllowScan(BOOL bNewValue);
BOOL GetEnableContextMenu();
void SetEnableContextMenu(BOOL bNewValue);
long GetCursorType();
void SetCursorType(long nNewValue);
long GetCodecCount();
BOOL GetAllowChangeDisplaySize();
void SetAllowChangeDisplaySize(BOOL bNewValue);
BOOL GetIsDurationValid();
long GetOpenState();
BOOL GetSendOpenStateChangeEvents();
void SetSendOpenStateChangeEvents(BOOL bNewValue);
BOOL GetSendWarningEvents();
void SetSendWarningEvents(BOOL bNewValue);
BOOL GetSendErrorEvents();
void SetSendErrorEvents(BOOL bNewValue);
long GetPlayState();
BOOL GetSendPlayStateChangeEvents();
void SetSendPlayStateChangeEvents(BOOL bNewValue);
long GetDisplaySize();
void SetDisplaySize(long nNewValue);
BOOL GetInvokeURLs();
void SetInvokeURLs(BOOL bNewValue);
CString GetBaseURL();
void SetBaseURL(LPCTSTR lpszNewValue);
CString GetDefaultFrame();
void SetDefaultFrame(LPCTSTR lpszNewValue);
BOOL GetHasError();
CString GetErrorDescription();
long GetErrorCode();
BOOL GetAnimationAtStart();
void SetAnimationAtStart(BOOL bNewValue);
BOOL GetTransparentAtStart();
void SetTransparentAtStart(BOOL bNewValue);
long GetVolume();
void SetVolume(long nNewValue);
long GetBalance();
void SetBalance(long nNewValue);
long GetReadyState();
double GetSelectionStart();
void SetSelectionStart(double newValue);
double GetSelectionEnd();
void SetSelectionEnd(double newValue);
BOOL GetShowDisplay();
void SetShowDisplay(BOOL bNewValue);
BOOL GetShowControls();
void SetShowControls(BOOL bNewValue);
BOOL GetShowPositionControls();
void SetShowPositionControls(BOOL bNewValue);
BOOL GetShowTracker();
void SetShowTracker(BOOL bNewValue);
BOOL GetEnablePositionControls();
void SetEnablePositionControls(BOOL bNewValue);
BOOL GetEnableTracker();
void SetEnableTracker(BOOL bNewValue);
BOOL GetEnabled();
void SetEnabled(BOOL bNewValue);
unsigned long GetDisplayForeColor();
void SetDisplayForeColor(unsigned long newValue);
unsigned long GetDisplayBackColor();
void SetDisplayBackColor(unsigned long newValue);
long GetDisplayMode();
void SetDisplayMode(long nNewValue);
BOOL GetVideoBorder3D();
void SetVideoBorder3D(BOOL bNewValue);
long GetVideoBorderWidth();
void SetVideoBorderWidth(long nNewValue);
unsigned long GetVideoBorderColor();
void SetVideoBorderColor(unsigned long newValue);
BOOL GetShowGotoBar();
void SetShowGotoBar(BOOL bNewValue);
BOOL GetShowStatusBar();
void SetShowStatusBar(BOOL bNewValue);
BOOL GetShowCaptioning();
void SetShowCaptioning(BOOL bNewValue);
BOOL GetShowAudioControls();
void SetShowAudioControls(BOOL bNewValue);
CString GetCaptioningID();
void SetCaptioningID(LPCTSTR lpszNewValue);
BOOL GetMute();
void SetMute(BOOL bNewValue);
BOOL GetCanPreview();
BOOL GetPreviewMode();
void SetPreviewMode(BOOL bNewValue);
BOOL GetHasMultipleItems();
long GetLanguage();
void SetLanguage(long nNewValue);
long GetAudioStream();
void SetAudioStream(long nNewValue);
CString GetSAMIStyle();
void SetSAMIStyle(LPCTSTR lpszNewValue);
CString GetSAMILang();
void SetSAMILang(LPCTSTR lpszNewValue);
CString GetSAMIFileName();
void SetSAMIFileName(LPCTSTR lpszNewValue);
long GetStreamCount();
CString GetClientId();
long GetConnectionSpeed();
BOOL GetAutoSize();
void SetAutoSize(BOOL bNewValue);
BOOL GetEnableFullScreenControls();
void SetEnableFullScreenControls(BOOL bNewValue);
LPDISPATCH GetActiveMovie();
LPDISPATCH GetNSPlay();
BOOL GetWindowlessVideo();
void SetWindowlessVideo(BOOL bNewValue);
void Play();
void Stop();
void Pause();
double GetMarkerTime(long MarkerNum);
CString GetMarkerName(long MarkerNum);
void AboutBox();
BOOL GetCodecInstalled(long CodecNum);
CString GetCodecDescription(long CodecNum);
CString GetCodecURL(long CodecNum);
CString GetMoreInfoURL(long MoreInfoType);
CString GetMediaInfoString(long MediaInfoType);
void Cancel();
void Open(LPCTSTR bstrFileName);
BOOL IsSoundCardEnabled();
void Next();
void Previous();
void StreamSelect(long StreamNum);
void FastForward();
void FastReverse();
CString GetStreamName(long StreamNum);
long GetStreamGroup(long StreamNum);
BOOL GetStreamSelected(long StreamNum);
CMediaPlayerDvd GetDvd();
CString GetMediaParameter(long EntryNum, LPCTSTR bstrParameterName);
CString GetMediaParameterName(long EntryNum, long Index);
long GetEntryCount();
long GetCurrentEntry();
void SetCurrentEntry(long EntryNumber);
void ShowDialog(long mpDialogIndex);
};  
"
 
 
en fait ma question est la suivante: "puis-je implémenter un activeX (en Visual C++) qui encapsulerai les méthodes et propriétés de l'interface Mediaplayer 7.0, 7.1 ou 8.0 et qui serait visible par Director et compagnie ??"
 
Merci d'avance pour vos réponses .

Reply

Marsh Posté le 04-01-2002 à 15:04:52    

UP !  :bounce:

Reply

Marsh Posté le 04-01-2002 à 19:50:07    

beuh, personne ?

Reply

Marsh Posté le 04-01-2002 à 19:54:04    

peut-être bientôt le record du topic monologue :lol:  
 
ah,non, maintenant c trop tard


---------------
mon site sur opengl/dx8 : www.glinfrench.fr.st
Reply

Marsh Posté le 04-01-2002 à 21:01:10    

oui et grâce à toi ;) !
 
 pendant un moment (juste un instant) j'ai cru que quelqu'un aller pouvoir m'aider. Faut pas rêver non plus :D ...

Reply

Marsh Posté le 05-01-2002 à 03:52:50    

il a beaucoup de succès mon topic décidement...

Reply

Marsh Posté le 05-01-2002 à 14:08:20    

bon je vais raconter des blagues (en plusieurs fois pour faire durer le suspense), ça va distraire les gens (et ptêt qu'ils prendre pitié de moi en me donnant des lies ou des infos sur le sujet qui je le rappelle est "comment accéder aux méthodes de ce foutu ActiveX Windows Media Player 7.0 ou plus sous Director ou autre, ou comment en reprogrammer un ActiveX encapsulant le Media Player" )
 
Alors c l'histoire d'un mec....

 

[edtdd]--Message édité par ZZZzzz--[/edtdd]

Reply

Marsh Posté le 05-01-2002 à 14:56:35    

c'est quoi la suite de l'histoire ?
 
...
 
t'as cherché avec google ? http://groups.google.com/groups?q= [...] gle+Search
 
http://groups.google.com/groups?th [...] 26rnum%3D7
 
sinon, tu peux essayer de demander sur le newsgroup : http://groups.google.com/groups?gr [...] smedia.sdk

Reply

Marsh Posté le 05-01-2002 à 14:56:35   

Reply

Marsh Posté le 05-01-2002 à 14:59:32    

sinon, si la bestiole ne supporte vraiment que d'être embeddée dans une page web, tu rajoutes IE dans ton applic, plus un html pour contrôler l'applic ...

Reply

Marsh Posté le 05-01-2002 à 20:10:49    

donc c l'histoire d'un mec qui est sur un pont et l'autre il s'en fout..
 
 
 
je sens des déçus :lol:
 
... désolé, je lrefrait plus ! :o  
 
 
Bon plus sérieusement tu m'as l'air plus doué que moi pour les recherches GOOGLE :D, je regarde un peu ça mais en gros j'ai l'impression que ça ne fait que confirmer ce que j'ai vu sur le site de Microsoft... c embêtant ça, mais d'après toi on peut tout aussi bien inclure un activeX IExplore qui inclu lui-même l'activeX Media Player 7.0 (ou plus) pour pouvoir le contrôler ?? ça m'a l'air assez bordélique mais si c la seule solution... en tout cas merci beaucoup YouDon'tCare, d'autant plus que c pas la première fois que tu m'aides...
 
tiens d'ailleurs j'en profite pour te poser une question c koi "IDipatch" ? à mon avis c un type d'interface pour communiquer avec l'ActiveX mais chui pas sûr

 

[edtdd]--Message édité par ZZZzzz--[/edtdd]

Reply

Marsh Posté le 06-01-2002 à 03:13:44    

tiens allez encore un ptit up pour la forme !

Reply

Marsh Posté le 06-01-2002 à 10:02:49    

oh tu sais, moi, sans mes lunettes ...
 
disclaimer : je ne suis pas un pro en COM donc je dis peut-être des grosses conneries :D
 
IDispatch c'est l'interface qui 'dispatche' les appels. COM s'en sert dès que tu utilises le "late binding", ie la résolution des noms en runtime.
 
exemple, tu utilises la méthode SetCurrentPosition(double) du media player. (je file des noms fictifs pour la suite)
 
* en C++, tu peux faire un QueryInterface(CLSID_mediaplayer, IID_mediaplayer7) qui te retourne un pointeur (ptr) sur l'interface du media player, IMediaPlayer7. tu n'as plus qu'à appeler ptr->SetCurrentPosition(4.5) pour donner la nouvelle position. c'est ce que qu'on appelle le vtable binding (ou early binding), car les appels sont résolus au moment de la compilation, par la vtable de l'interface.
 
* en Javascript, tu ne peux pas connaître à l'avance la bestiole et donc appeler la méthode par la vtable. c'est pour ça qu'il y a IDispatch. tu as un code javascript qui ressemble à :
 
mediaplayer = new ActiveXObject("microsoft.mediaplayer" );
mediaplayer.CurrentPosition = 4.5;
 
la première ligne créé l'objet, la seconde change la propriété currentPosition. ha, j'ai oublié de dire, dans les objets COM, tu as les méthodes et les propriétés. et les propriétés sont formées de deux fonctions : une fonction get, une fonction set. ici, on set la propriété CurrentPosition, on appelle donc la fonction SetCurrentPosition qui s'en occupe.
 
donc, maintenant qu'on a l'objet et une ligne de code, javascript parse cette ligne et voit qu'on appelle une fonction avec un paramètre. en interne, comment appeler cette fonction ? par IDispatch, justement, et la fonction magique GetIDsOfNames() qui te renvoie un dispid (un entier) à utiliser pour la méthode Invoke(), qui appelle la méthode.
 
donc en interne il se passe un truc comme :
 
LPOLESTR methodName; // le nom de la méthode à appeler
DISPID dispid; // l'id de la méthode à appeler
VARIANTARG* params; // les paramètres à passer à la méthode
 
// tout d'abord, un QueryInterface() sur l'objet pour obtenir une interface IDispatch (l'obj est celui créé avec new ActiveXObjectt() ):
 
LPDISPATCH lpd;
obj->QueryInterface(IID_IDispatch, &lpd);
 
// on parse le code javascript pour obtenir l'appel et les arguments, on stocke le nom de la méthode dans methodName, les paramètres dans params
 
...; // le code pour faire tout ça :D
...; // ici params est un tableau d'un VARIANTARG qui contient '4.5' avec un type VT_R4 (flottant)
 
// on choppe l'id de la méthode :
lpd->GetIDsOfNames(&methodName, &dispid);
 
// on prépare la structure de paramètres:
DISPPARAM dispparams;
dispparams.cArgs = le nombre de paramètres;
dispparams.rgvargs = un pointeur vers params;
 
// on invoke la méthode :
VARIANTARG returnRes; // ce que la méthode renvoie
lpd->Invoke(dispid, &dispparams, &returnRes);
 
//
 
et voilà ... notre petit IDispatch s'est chargé de dispatcher les appels à l'objet. comment ça marche en interne ? j'en sais trop rien.
 
ça, c'est le late binding - résolution des méthodes en runtime.
 
et apparemment, tu peux aussi utiliser le early binding dans visual basic, si l'objet donne des infos en plus. là je ne sais pas non plus comment ça marche, faut que je bouquine.
 
(au fait, le code n'inclus aucun code de cleanup et aucun checking d'erreur)

Reply

Marsh Posté le 07-01-2002 à 01:00:20    

merci beaucoup Youdon'tcare, je lirai tout ça demain à tête reposé :) !

Reply

Marsh Posté le 07-01-2002 à 10:12:04    

bon bah ok j'ai compris, mais alors comment se fait-il que l'on peut via IE accéder aux méthodes du Media Player 7.0 (et plus) sans le IDipatch (ou late binding) ? IE serait-il capable d'accéder aux méthodes avec un autre mécanisme ?
 
voici par exemple un code html qui fonctionne très bien:
 
"<HTML>
<BODY>
 
<OBJECT ID="Player" WIDTH=320 HEIGHT=240 CLASSID="CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6">
</OBJECT>
 
<INPUT TYPE="BUTTON" NAME="BtnPlay" VALUE="Play" OnClick="StartMeUp()">
<INPUT TYPE="BUTTON" NAME="BtnStop" VALUE="Stop" OnClick="ShutMeDown()">
 
<SCRIPT>
<!--
function StartMeUp ()
{
    Player.URL = "mms://netshow.microsoft.com/ms/sbnasfs/wmt/turtle28.asf";
}
 
function ShutMeDown ()
{
    Player.controls.stop();
}
-->
</SCRIPT>
 
</BODY>
</HTML>"
 
Je ne vois à priori pas ce qui empêche un autre application (comme Visual C++ ou Director) d'accéder à ses fonctions et propriétés si IE y arrive, le problème qui se pose quand on veut contrôler l'activeX media player7.0 via un activeX IE est évidemment au niveau des performances obtenues. Hors l'utilité d'utiliser WMP 7.0 concerne justement ces performances (car WMP 6.4 ou antérieur nest pas capable de gérer correctement certains formats vidéos). Alors quelle est la solution ? Dois-je reprogrammer complètement un activeX qui supporte le IDispatch (soit-dit en passant je n'ai absoluement aucune idée de comment faire la chose, j'ai déjà réalisé un activeX mais sans trop vraiment en comprendre les mécanismes) et qui hérite de la classe Media Player afin de "wraper" ses méthodes et propriétés pour les rendre accessibles de la même manière que WMP 6.4 ? j'ai peur que ce soit assez long à faire (en admettant déjà que ce soit possible)...

Reply

Marsh Posté le 07-01-2002 à 13:30:13    

comme je l'ai déjà dit, je ne suis pas un expert en COM. j'essaierai de regarder tout ça de plus près, mais je ne te promets rien.
 
une autre quote du site microsoft :  
 
The Microsoft® Windows Media? Player control is a standard ActiveX® control that uses Microsoft Component Object Model (COM) technology. The Windows Media Player functionality is distilled into a set of programming interfaces that follows standard COM guidelines. You can program these interfaces on a standard HTML Web page using the player control object model with Microsoft JScript® or Microsoft Visual Basic® Scripting Edition (VBScript). You can also program them in skins using Microsoft Jscript®. Only these two scripting languages are supported in this release.
 
et une autre d'un des liens vers groups.google plus haut :
 
There is an ActiveX control for Windows Media Player 7 (I think ...) but I know it is not registered in Visual Basic (if you are using this one ...) but you simply have to use the component Windows\system32\wmp.ocx or something like that, this one is the WMP7 activeX.
 
effectivement, il y a bien un wmp.ocx ... bref je ne sais pas quoi penser de ces deux infos bien contradictoires.

Reply

Marsh Posté le 07-01-2002 à 14:05:51    

bon ben passer par un HTML ça ne me plait pas vraiment, d'autant que je ne suis pas sûr qu'avec Director on puisse accéder aux fonctions JScript (ou VBScript) d'un fichier HTML contenu dans un ActiveX de navigation WEB.
 
Sous VB il y a bien moyen de cherger l'activeX wmp.ovcx (en spécifiant toi-même le chemin) mais on ne peut malheureusement pas inclure "un OCX dans un OCX" (car moi ce que je veux faire c un ActiveX qui encapsule celui du Media Player et qui donne accès à l'interface). Ou alors je peux aussi programmer un XTra Director qui encapsule cette ActiveX mais encore une fois je n'ai jamais programmé un XTra (apparement c pas si simple) et de plus je n'ai jamais écrit de conteneur d'activeX (et ça aussi c chiant à faire sous VC). Bref... faut que je trouve un truc tout fait :D !

Reply

Marsh Posté le 08-01-2002 à 10:36:31    

bon ben je vais devoir me programmer un activeX étant capable de lire les vidéos supportées par le Media Player 7.0, pour commencer je vais devoir apprendre à faire les activeX correctement (j'en ai déjà fait un mais il est pourri).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed