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

Delphi Discussion :

Comment jouer un .wav sur un ordi distant?


Sujet :

Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 21
    Par défaut Comment jouer un .wav sur un ordi distant?
    Bonjour,
    voilà, je souhaite pouvoir executer un fichier son sur un ordinateur du réseau. J'ai, bien sur, les droits d'admin.
    Merci d'avance pour toute suggestion.

  2. #2
    Membre chevronné
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Par défaut
    bonjour,
    Juste une idée pas testée :

    En lançant un fichier .bat dont la seule ligne serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\Windows\Mplayer.exe ReveilleToi.wav
    ça doit bien marcher aussi avec des scripts

    Par contre tu veux faire ça dans la cadre d'une application Delphi ?
    Si oui : regarde l'aide Delphi sur Shellexecute et recopie la ligne ce dessus

    bonne recherche !

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    regarde du coté de WMI qui permet ce type de traitement sans avoir à connaître les API réseaux.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 21
    Par défaut
    Merci de vos réponses, mais pouvez-vous me faire un petit code d'exemple, car j'y arrive pas...
    C'est sur un ordi DISTANT, donc l'un de mon réseau que je veux jouer un son.

    Merci!

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Voir ce tutoriel
    http://laurent-dardenne.developpez.com/articles/wmi-p2/
    Cf exemple 9-Shutdown, à adapter bien sûr.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 21
    Par défaut
    Ha, tu est gentil Laurent, mais je ne comprends pas grand-chose là :
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    unit Main;
    { Reboot/arrête un PC distant}
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,WbemScripting_TLB, ActiveX;
     
    type
      TForm1 = class(TForm)
        BtConnexion: TButton;
        procedure BtConnexionClick(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        WMILocator:          TSWbemLocator;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
    uses ComObj,OleServer;
     
    procedure TForm1.BtConnexionClick(Sender: TObject);
     
    var
      WmiService:          SWbemServices;
     
      WmiObjet:            SWbemObject;
      wmiObjetSet:         SWbemObjectSet;
     
     
      WmiProperty:         SWbemProperty;
     
      ObjectEnumerator:    IEnumVariant;
      ArrayVariant:        OleVariant;  // Tableau de variant
      NumberItem:          LongWord;
     
      ShutdownMethod_inParameters,
      Shutdown :           SWbemObject;
     
      PropertyReboot :     OleVariant;
     
      ShutdownMethod:      SWbemMethod;
     
    begin
     WMILocator:= TSWbemLocator.Create(self);
     
    {-----------------------------------------------------------------------------}
          // Initialisation
      try
       {By default, all members of the local users group on Windows NT/Windows 2000
       systems have read-only access to all namespaces. To change the default access
       permissions from Windows NT, use the WMI Control application (Wbemcntl.exe).
       To change the default access permissions from Windows 2000, use the
       Microsoft® Management Console.
       }
     
       // Sécurité par défaut ( cf la base de registre ). Peut être omis
      WMILocator.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate );
      WMILocator.Security_.Set_AuthenticationLevel(wbemAuthenticationLevelDefault);
      { The WbemImpersonationLevelEnum constants define the security impersonation levels :
        1 wbemImpersonationLevelAnonymous
        Short name: Anonymous
        Hides the credentials of the caller. Calls to WMI may fail with this impersonation level.
     
        2 wbemImpersonationLevelIdentify
        Short name: Identify
        Allows objects to query the credentials of the caller. Calls to WMI may fail with this impersonation level.
     
        3 wbemImpersonationLevelImpersonate
        Short name: Impersonate
        Allows objects to use the credentials of the caller. This is the recommended impersonation level for Scripting API for WMI calls.
     
        4 wbemImpersonationLevelDelegate
        Short name: Delegate
        Windows 2000 and later:  Allows objects to permit other objects to use the credentials of the caller. This impersonation will work with Scripting API for WMI calls but may constitute an unnecessary security risk.
      }
     
      {The WbemAuthenticationLevelEnum constants define the security authentication levels :
      0 WbemAuthenticationLevelDefault
      Short name: Default
      WMI uses the default Windows Authentication setting.
     
      1 WbemAuthenticationLevelNone
      Short name: None
      Uses no authentication.
     
      2 WbemAuthenticationLevelConnect
      Short name: Connect
      Authenticates the credentials of the client only when the client establishes a relationship with the server.
     
      3 WbemAuthenticationLevelCall
      Short name: Call
      Authenticates only at the beginning of each call when the server receives the request.
     
      4 WbemAuthenticationLevelPkt
      Short name: Pkt
      Authenticates that all data received is from the expected client.
     
      5 WbemAuthenticationLevelPktIntegrity
      Short name: PktIntegrity
      Authenticates and verifies that none of the data transferred between client and server has been modified.
     
      6 WbemAuthenticationLevelPktPrivacy
      Short name: PktPrivacy
      Authenticates all previous impersonation levels and encrypts the argument value of each remote procedure call.
      }
     
        // Attention aux majuscules-minuscules pour le password.
      WmiService:= WMILocator.ConnectServer('P600', 'ROOT\CIMV2', 'MyDomaine\Administrateur', 'lolo', '',
                                            '', wbemConnectFlagUseMaxWait, nil);
      except
       on E:EOleException do
        begin
         // E_ACCESSDENIED=$80070005 si pb de mot de passe
         ShowMessage(StrOriginError(E.ErrorCode)+' ['+IntToHex(E.ErrorCode,8)+'] '+E.Message);
         Raise;
        end;
      end;
        //Ajoute au process appelant le privilége wbemPrivilegeShutdown (SE_SHUTDOWN_NAME)
      wmiService.Security_.Privileges.Add(wbemPrivilegeShutdown, True);
     
      wmiObjetSet := wmiService.ExecQuery(
        'SELECT * FROM Win32_OperatingSystem WHERE Primary=True',
        'WQL', wbemFlagReturnImmediately, nil);
     
       // Affecte un énumérateur pour la collection d'objet SWbemObject
      ObjectEnumerator:= (WmiObjetSet._NewEnum) as IEnumVariant;
     
        // Retourne NumberItem éléments dans le tableau ArrayVariant,
        // ici 1 élément est demandé
      while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
      begin
           // Récupére de la collection l'objet SWbemObject courant
        WmiObjet := IUnknown(ArrayVariant) as SWBemObject;
     
        ShutdownMethod:= wmiObjet.Methods_.Item('Win32Shutdown', 0);
        ShutdownMethod_inParameters:= ShutdownMethod.InParameters;
        Shutdown:= ShutdownMethod_inParameters.SpawnInstance_(0);
        WmiProperty := Shutdown.Properties_.Add('Flags', wbemCimtypeSint32, False, 0);
        PropertyReboot:= EWX_SHUTDOWN; // EWX_REBOOT;
        {Value   Meaning
          0      Log Off
          0 + 4  Forced Log Off
          1      Shutdown
          1 + 4  Forced Shutdown
          2      Reboot
          2 + 4  Forced Reboot
          8      Power Off
          8 + 4  Forced Power Off
        }
        wmiProperty.Set_Value(PropertyReboot);
     
        wmiObjet.ExecMethod_('Win32Shutdown', Shutdown, 0, nil);
      end;
     
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      WMILocator.Free;
    end;
     
    end.
    Comment "adapter" pour faire jouer son.wav sur "toto" ?

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 2
    Par défaut
    N'ayant pas de Delphi avec moi au boulot, je ne sais pas si cette solution marchera :

    Regarde dans le composant DSPack (telechargeable gratuitement sur progdigy.com). En utilisant un objet de type TSystemDevEnum, tu peux lister les cartes sons presentes sur un pc. Ca se fait de la maniere suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uses DSPack;
    ....
    SDE : TSystemDevEnum;
    ....
    SDE := TSystemDevEnum.create(CLSID_Audio...Category);
    ici, l'objet SDE contient le nom des cartes sons ainsi que le moniker necessaire pour jouer.
    Regarde dans l'aide de DSPack s'il n'existe pas un CLSID qui liste les cartes présentes sur un ordinateur du reseau
    Si tu trouves un CLSID je pourrais t'aider pour utiliser les classes de DSPack pour jouer ton morceau sur la carte choisie.

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mariussy
    Ha, tu est gentil Laurent,
    Merci
    Citation Envoyé par Mariussy
    mais je ne comprends pas grand-chose là :
    Ce qui n'a donc rien à voir avec ma gentillesse, on est d'accord ?
    Qu'est-ce que tu ne comprends pas ?
    As-tu pris le temps de lire le tutoriel sur WMI ?

    Le code à modifier et à compléter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      wmiObjet.ExecMethod_('Win32Shutdown', Shutdown, 0, nil);
    La méthode Create de la classe Win32_Process permet de démarrer un process :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/create_method_in_class_win32_process.asp

    Ensuite il faut pouvoir exécuter un fichier Wav sur le distant en ligne de commande :
    "sndrec32.exe /play /close %windir%\media\ringin.wav" (cette solution pose le pb de l'éxécution en mode fenêtré).
    ou
    http://www.cmdtools.com/ (Wav.Zip) (cette solution apporte une phase de déploiement).

    Voir WMI l'exemple 8-CreateProcess.



    Sinon une autre approche
    http://www.sysinternals.com/Utilities/PsExec.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    psexec \\RemotePC "sndrec32.exe /play /close %windir%\MonFichier.wav"
    Le paramètre -i peut copier un fichier sur le distant. Dans ce cas il y a 2 passes, une pour copier le fichier (.exe ou .wav), l'autre pour 'jouer' le son.

  9. #9
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut!

    Perso, je pense que j'utiliserais soit TClientSocjet et TServerSocket pour connecter les pcs, soit avec NetSend, etc...
    Ensuite, je pense que j'utiliserais SndPlaySound pour lancer la lecture du sample sur le pc destination.
    Quelques questions :
    - Faut-il que le lancement du wav soit immédiat, c'est-à-dire qu'il faut que le moment où tu demandes l'éxécution du wav sur le serveur et le moment où le wav est réellement lancer soit très très court ou bien au contraire, tu peux te permettre un temps de réponse de quelques secondes ?
    - Est-ce sur un réseau privé ou bien ça peut passer par internet ?

    à+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 21
    Par défaut
    Merci!!!

    Pour Laurent:
    Je ne peux pas maintenant tester tout ça, mais je comprends mieux, et je pense pouvoir y arriver. Merci encore.

    Pour Sub0: L'idée d'utiliser NetSend me parraît très attractive, car c'est probablèment la plus simple pour moi. Qu'il y a quelques secondes d'écart c'est n'est pas grave. C'est pour un réseau local, pas internet.
    Dans ce sens, si tu peut me faire un petit exemple je te remercie par avance...?

  11. #11
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut!

    Bizarrement, je n'ai pas été averti de ton nouveau message.
    Si le sujet est toujours d'actualité, je pensais envoyer le sample sur l'ordinateur avec cette méthode :
    http://nono40.developpez.com/sources/source0015/

    Une fois le fichier transféré, tu lances sa lecture avec SndPlaySound, puis tu le supprimes lorsque tu n'en as plus besoin.

Discussions similaires

  1. Comment lancer une appli sur une machine distante
    Par J.Michel dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/09/2007, 13h00
  2. Script Shell qui lance un programme sur un ordi distant avec SSH
    Par bilibou dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 02/06/2007, 11h18
  3. Réponses: 3
    Dernier message: 21/10/2005, 09h54

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