IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Accéder à FullSpace et StretchToFit pour TWindowsMediaPlayer en D6 sous W8.1


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut Accéder à FullSpace et StretchToFit pour TWindowsMediaPlayer en D6 sous W8.1
    Bonjour,

    Suite à une autre discussion dans cette même rubrique, je vous expose un problème très spécifique.

    Je suis actuellement sous Windows 8.1, et j'utilise Delphi 6 Personal Edition pour la réalisation de DLLs qui seront utilisées à partir de programmes réalisés dans d'autres langages. Dans ce contexte, je crée en cours d'exécution un objet TWindowsMediaPlayer que j'injecte dans une form dont le programme appelant la DLL me passe le handle. Cela marche très bien.Je peux piloter cet objet, le positionner, lui charger une video ou une musique, gérer le volume, la pause/relance etc.

    Mais je n'arrive pas à mettre le player en plein écran, ou éventuellement changer ses dimensions en passant largeur et hauteur en paramètre. Que ce soit en changeant la dimension ou en utilisant une fonction trouvée sur le net qui met le player en plein écran via les services COM, il prend bien la bonne dimension, mais la vidéo elle-même reste à la dimension initiale, centrée dans le nouvel espace du player, avec du noir pour remplir le reste.

    Après une longue discussion avec Thierry, j'ai pu m'assurer que:
    - mon dossier Windows\System32\ contient bien WMP.dll
    - j'ai installé avec succes l'ActiveX Windows Media Player 'WMP.dll) dans Delphi 6 Personal Edition
    - j'ai vérifié le contenu de WMPLib_TLB.pas (7438 lignes) contient bien les propriétés et méthodes FullSpace et StretchToFit

    Mais, et c'est là que j'ai besoin d'aide:
    - WMP.FullSpace et WMP.StretchToFit ne sont pas reconnus par le compilateur
    - WMP.ControlInterface.Fullspace ou WMP.ControlInterface.StretchToFit ne sont pas reconnus par le compilateur

    J'ai essayé d'utiliser un WMPLib_TLB.pas dont Thierry m'avait donné le lien (fichier d'un peu plus de 5000 lignes). Là, j'ai bien eu accès à ces proprétés, mais cela plante à l'exécution, et d'autres propriétés et méthodes ne sont plus reconnues. Visiblement, il s'agit d'un fichier plus ancien qui n'est pas en phase avec WMP.dll de mon système W8.1.

    Est-ce qu'elqu'un pourrait m'indiquer comment rendre ces propriétés accessibles (publiques ?) ? Je remets en pièce jointe une copie de ce fichier. C'est en format 7z pour respecter les limites de taille des pièces jointes...

    Meri pour votre aide.
    Klaus
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par KlausGunther Voir le message
    Mais, et c'est là que j'ai besoin d'aide:
    - WMP.FullSpace et WMP.StretchToFit ne sont pas reconnus par le compilateur
    - WMP.ControlInterface.Fullspace ou WMP.ControlInterface.StretchToFit ne sont pas reconnus par le compilateur
    Normal...
    Si je regarde le source de l'unité , je constate que le composant TWindowsMediaPlayer encapsule l'interface IWMPCore (ligne 6795 FIntf: IWMPCore;), qui est dépourvue des méthodes FullScreen (pas FullSpace) et StretchToFit.

    On retrouve celles ci dans des interfaces héritées comme IWMPPlayer4, IWMPPlayer3, IWMPPlayer2 et IWMPVideoCtrl et leur équivalent dispatchable...

    Pour les héritages, on a :
    IWMPPlayer4 <= IWMPCore3 <= IWMPCore2 <= IWMPCore
    IWMPPlayer3 <= IWMPCore2 <= IWMPCore
    IWMPPlayer2 <= IWMPCore
    IWMPVideoCtrl <= IDispatch

    Je me dis que IWMPPlayer4 serait un bon candidat au remplacement de IWMPCore, mais certaines des méthodes proposées par TWindowMediaPlayer devront être amendées ; je n'ai pas regardé en détail ce point.

    J'ai donc entamé une petite recherche, j'ai trouvé quelqu'un qui avait eu la même idée et qui a proposé une encapsulation de ce composant. Cerise sur le gateau, il a proposé comme source une unité Delphi.... 6 (elle n'est pas belle la vie ? )
    http://drang.s4.xrea.com/program/tip...diaplayer.html

    Citation Envoyé par KlausGunther Voir le message
    Est-ce qu'elqu'un pourrait m'indiquer comment rendre ces propriétés accessibles (publiques ?) ?
    Cette unité est à tester et valider mais elle me semble un bonne piste à exploiter...

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Cette piste est très intéressangte ! Merci beaucoup !

    J'ai eu un peu de mal - la page étant en Japonais, et malgré plusieurs traducteurs en ligne, je n'ai pas vraiment retrouvé ce qui m'aurait permis de l'exploiter. Mais en cherchant par Google TMyCustomWindowsMediaPlayer, je suis tombé sur ce lien: http://drang.s4.xrea.com/program/lib...ediaPlayer.pas qui donne le texte de l'unité. Les commentaires sont toujours en japonais, mais le source est lisible. Je reprendrai les commentaires plus tard, à partir d'une traduction.

    J'ai donc créé cette unité et je l'ai attachée à ma DLL. Mais elle ne semble pasêtre conçue pour D6. En effet, bien que certaines procédures et fonctions soient définiés dans l'unité, et ce avant leur utilisation, le compilateur ne les trouve pas. J'ai inséré des déclarations FORWARD pour ces éléments, et là, il les trouve.

    Mais maintenant, je suis bloqué à la ligne 738:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor TMyCustomWindowsMediaPlayer.Create(AOwner: TComponent);
    avec le message: [Erreur] WMP_klaus [738]: Identificateur non déclaré: 'TMyCustomWindowsMediaPlayer'

    Je joins l'unité en pièce jointe. Qu'est-ce que je peux faire pour réparer cela ?
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par KlausGunther Voir le message
    Mais maintenant, je suis bloqué à la ligne 738:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor TMyCustomWindowsMediaPlayer.Create(AOwner: TComponent);
    avec le message: [Erreur] WMP_klaus [738]: Identificateur non déclaré: 'TMyCustomWindowsMediaPlayer'

    Je joins l'unité en pièce jointe. Qu'est-ce que je peux faire pour réparer cela ?
    Le lien que je vous ai fourni renvoie vers une page où le source est complet...

    Bis repetita placent http://drang.s4.xrea.com/program/tip...diaplayer.html

  5. #5
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    J'ai pris le contenu de cette page. Il suffisait de l'entourer d'une ligne "UNIT ..." et "End." Compilation de l'unité sans problème. Parfait. Je reconnais que la page en japonais me gênait, et j'ai cherché un truc plus lisible. Erreur de ma part.

    Mais, StretchToFit est toujours inconnu du compilateur, ainsi d'ailleurs que wmppsPlaying. Je suis perplexe..

    EDIT

    J'ai ajouté l'unité en pièce jointe.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    Mais, StretchToFit est toujours inconnu du compilateur, ainsi d'ailleurs que wmppsPlaying. Je suis perplexe..
    Je le suis aussi.
    Votre unité inclut bien la propriété stretchToFit.
    Pour voir la constante wmppsPlaying, il suffit de rajouter WMPLib_TLB dans la clause uses de l'unité où vous utilisez la classe TMyWindowsMediaPlayer...

  7. #7
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    D'accord pour la clause USES: je l'ai ajouté dans la liste, et le symbole wmppsPlaying est reconnu. dont acte.

    Mais le problème du StretchToFit reste mystérieux. D'ailleurs, FullScreen n'est pas reconnu non plus, par le compilateur !

    EDIT

    Pour le symbole inconnu, j'ai finalement enlevé à nouveau la TLB des clauses USES, et j'ai intégré les définitions des constantes d'état en les copiant de la TLB. Ca donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const
      wmppsUndefined = $00000000;
      wmppsStopped = $00000001;
      wmppsPaused = $00000002;
      wmppsPlaying = $00000003;
      wmppsScanForward = $00000004;
      wmppsScanReverse = $00000005;
      wmppsBuffering = $00000006;
      wmppsWaiting = $00000007;
      wmppsMediaEnded = $00000008;
      wmppsTransitioning = $00000009;
      wmppsReady = $0000000A;
      wmppsReconnecting = $0000000B;
      wmppsLast = $0000000C;
    A ce niveau-là, ça passe à la compilation. Reste le problème de F=StretchToFit et FullScreen...

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    Pour le symbole inconnu, j'ai finalement enlevé à nouveau la TLB des clauses USES, et j'ai intégré les définitions des constantes d'état en les copiant de la TLB.
    Je n'aime pas les duplications de code. A la moindre modification, il y a des oublis et les bugs qui en découlent...
    Citation Envoyé par KlausGunther Voir le message
    A ce niveau-là, ça passe à la compilation. Reste le problème de F=StretchToFit et FullScreen...
    Sur mon poste, votre unité avec la clause uses adéquate compile et reconnait ses 2 propriétés de l'interface...
    Il y a autre chose...

  9. #9
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Voici le code que j'utilise, dans ma DLL (en tout cas, un extrait des parties significatives):
    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
     
     
    function CreateMultiPlayer(wnd: HWND; tp,lft,w,h: integer): integer; stdcall; export;
    var
      XP: TMyCustomWindowsMediaPlayer;
      VLC: TPasLibVlcPlayer;
    begin
      result := -1;
           try
             XP := TMyCustomWindowsMediaPlayer.Create(frm2DLLForm);
             XP.Top := tp;
             XP.Left := lft;
             XP.Width := w;
             XP.Height := h;
             XP.ParentWindow := wnd;
             result := integer(XP);
           except
           end;
    end;
     
    // le paramètre "player" transmet une valeur correspondant à l'objet player créé ci-dessus
    function ResizeMultiPlayer(player,t,l,w,h: integer): integer; stdcall; export;
    var
      r: TRect;
      XP: TMyCustomWindowsMediaPlayer;
      a,b,c,d: integer;
      s: WideString;
    begin
      result := 0;
      XP := TMyCustomWindowsMediaPlayer(player);
      if not assigned(XP) then exit;
      MyClientRect(XP.ParentWindow, r);
      SmoothResizeMediaPlayer(XP, r, r);   // <=========== ajuste correctement la fenêtre du player à la ClientArea de la form parent du player
      XP.FullSpace(true);                       // <=========== par contre, erreur ici !
      XP.StretchToFit(true);                   // <=========== et erreur ici !
    end;
    Le problème viendrait peut-être de Dlphi 6 si l'unité en question a été conçue pour un Delphi plus récent ?

  10. #10
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    Voici le code que j'utilise, dans ma DLL (en tout cas, un extrait des parties significatives):
    Apparemment, travailler si tard nuit à votre capacité d'analyse...
    1. Vous n'utilisez pas la bonne classe pour votre player,,
    2. Les propriétés ne sont pas des procédures.


    Corrigé, cela donne :
    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
    function CreateMultiPlayer(wnd: HWND; tp,lft,w,h: integer): integer; stdcall; export;
    var
      XP: TMyWindowsMediaPlayer; //TMyCustomWindowsMediaPlayer;
      VLC: TPasLibVlcPlayer;
    begin
      try
        XP := TMyWindowsMediaPlayer.Create(frm2DLLForm); // TMyCustomWindowsMediaPlayer.Create(frm2DLLForm);
        XP.Top := tp;
        XP.Left := lft;
        XP.Width := w;
        XP.Height := h;
        XP.ParentWindow := wnd;
        result := integer(XP);
      except
        result := -1;
      end;
    end;
     
    // le paramètre "player" transmet une valeur correspondant à l'objet player créé ci-dessus
    function ResizeMultiPlayer(player,t,l,w,h: integer): integer; stdcall; export;
    var
      r: TRect;
      XP: TMyWindowsMediaPlayer; // TMyCustomWindowsMediaPlayer;
      a,b,c,d: integer;
      s: WideString;
    begin
      result := 0;
      XP := TMyWindowsMediaPlayer(player); // TMyCustomWindowsMediaPlayer(player);
      if not assigned(XP) then exit;
      MyClientRect(XP.ParentWindow, r);
      SmoothResizeMediaPlayer(XP, r, r);   // <=========== ajuste correctement la fenêtre du player à la ClientArea de la form parent du player
      XP.FullSpace := true; // XP.FullSpace(true);                       // <=========== par contre, erreur ici !
      XP.StretchToFit := true; // XP.StretchToFit(true);                   // <=========== et erreur ici !
    end;

  11. #11
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    YES!!!!!!!

    Un grand MERCI sincère pour votre aide !

    La clé était l'utilisation de TMyWindowsMediaPlayer au lieu de TMyCustomWindowsMediaPlayer. Certes, dans la doute, j'ai confondu propriété et méthode, mais j'avais essayé les deux, et le message à la compilation était identique: l'identifiant n'était pas reconnu. Maintenant, j'en vois la raison.

  12. #12
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Juste pour info:
    Il y avait un problème de dimensionnement et positionnement de la fenêtre du player, avec l'unité telle qu'elle était. Le fait de changer les propriétés TOP ou LEFT changeait également la dimension verticale et/ou horizontale ! J'ai corrigé cela et j'ai obtenu une version pleinement opérationnelle. Juste au cas où cela pourrait intéresser quelqu'un, cette version est placée en pièce jointe. Mes modifications (2 lignes siccessives) sont marquées du commentaire "? klaus".

    Un grand Merci encore à votre aide patiente et efficace !
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/02/2011, 01h06
  2. Accéder aux constantes à déclarer pour une méthode de classe
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 18/06/2009, 14h16
  3. [VB6] : pour faire un Randomize sous vb... merci
    Par delnic dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/01/2003, 15h49
  4. quel langage choisir pour faire de script sous windows
    Par pas05 dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 18/11/2002, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo