Lire élément X dans une playlist VLC

Signaler
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010
-
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010
-
Bonjour
J'ai un projet de création de télécommande wifi pour VLC sur Windows mobile et je bloque sur la partie de sélection de chaine.
Alors j'ai une playlist et j'aimerai lire l'élément X de la playlist en évitant de faire X fois programme plus.j'ai trouver via la console de l'interface telnet de VLC la commande goto X mais je n'arrive pas a l'exploité dans mon programme

WinExec("C:\\Progra~1\\VideoLAN\\VLC\\vlc.exe C:\\playlist.m3u --extraintf rc --telnet-port 6666 --telnet-password admin",1);//lance ma playlist avec vlc, mon interface console et le serveur telnet 


avez vous une idée comment exploiter la fenetre console de VLC pour lancé des goto X

17 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Bienvenue,

(Je précise que je n'ai jamais codé pour windows mobile, le code ci-dessous est pour PC, mais bon, il devrait aller aussi).

WinExec est obsolète. Utiliser CreateProcess à la place.

Concernant ton problème, il est relativement classique.
Voilà un début de piste. Ce programme lance :
cmd /C set /P a= && echo %a%

Ce qui demande à l'utilisateur de donner une valeur pour a, puis affiche la valeur donnée. Mais ce n'est pas l'utilisateur qui va donner a, mais notre programme.
Tout se fait à l'aide de "pipes". Ils permettent d'envoyer des caractères à une console et de lire les valeurs retournées.

Application console. Pour compiler sous gcc, ajouter -nostartfiles -nodefaultlibs -nostdlib -ffreestanding dans les options du lieur.
Pour compiler sous VC, s'arranger pour que le lieur ignore toutes les librairies par défaut (/nodefaultlib).
Sous VC, en cas d'erreur LNK2001 : __chkesp symbole externe non résolu -> Enlever /GZ des options de compilation
#define UNICODE

#include <windows.h>

#ifdef UNICODE
#define _T(x) L ## x
typedef unsigned short TCHAR;
#else
#define _T(x) x
typedef char TCHAR;
#endif

DWORD __stdcall Err_ShowLast(TCHAR* lpTitle)
{
  DWORD nLastError;
  LPTSTR lpMessageBuffer;

  nLastError = GetLastError();

  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  MessageBox(NULL, lpMessageBuffer, lpTitle, MB_OK | MB_ICONERROR);

   LocalFree(lpMessageBuffer);
  return nLastError;
}

void* __stdcall Mem_Set(void* lpArea, BYTE nValue, DWORD nSize)
{
  BYTE* lpByteArea;
  DWORD nI;

  lpByteArea = (BYTE*)lpArea;
  for (nI = 0; nI < nSize; nI++)
    lpByteArea[nI] = nValue;
  return lpArea;
}

DWORD __stdcall ReadPipe(HANDLE hPipe)
{
  HANDLE hOutput;
  char lpBuffer[512];
  DWORD nBytesRead;
  DWORD nBytesWritten;

  hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

  while (ReadFile(hPipe, lpBuffer, 512, &nBytesRead, NULL) && nBytesRead)
    WriteFile(hOutput, lpBuffer, nBytesRead, &nBytesWritten, NULL);

  return 0;
}

int __cdecl mainCRTStartup()
{
  SECURITY_ATTRIBUTES securityAttribs;
  HANDLE hPipeInputRead;
  HANDLE hPipeInputWrite;
  HANDLE hPipeOutputRead;
  HANDLE hPipeOutputWrite;
  STARTUPINFO startupInfo;
  PROCESS_INFORMATION processInfo;
  TCHAR lpCommandLine[512];         /* Le paramètre lpCommandLine de CreateProcessW ne doit pas être read-only */
  HANDLE hReadPipe;
  DWORD nBytesWritten;
  DWORD nResult;

  nResult = 1;

  /* Création des pipes de lecture et d'écriture */
  securityAttribs.nLength = sizeof(securityAttribs);
  securityAttribs.lpSecurityDescriptor = NULL;
  securityAttribs.bInheritHandle = TRUE;
  if (! CreatePipe(&hPipeInputRead,  &hPipeInputWrite,  &securityAttribs, 0))
  {
    Err_ShowLast(_T("Cannot create input pipe"));
    goto the_end;
  }
  if (! CreatePipe(&hPipeOutputRead, &hPipeOutputWrite, &securityAttribs, 0))
  {
    Err_ShowLast(_T("Cannot create output pipe"));
    goto close_input_pipe;
  }

  /* Préparation des infos de lancement du processus avec pipe et affichage de la fenêtre */
  Mem_Set(&startupInfo, 0, sizeof(startupInfo));
  startupInfo.cb = sizeof(startupInfo);
  startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  startupInfo.wShowWindow = SW_SHOW;
  startupInfo.hStdInput = hPipeInputRead;
  startupInfo.hStdOutput = hPipeOutputWrite;
  startupInfo.hStdError = hPipeOutputWrite;

  /* Lancement du processus */
  lstrcpy(lpCommandLine, _T("cmd /C set /P a= && echo %a%"));
  if (! CreateProcess(NULL, lpCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo))
  {
    Err_ShowLast(_T("Cannot create process"));
    goto close_output_pipe;
  }

  /* Lancement du thread de lecture du pipe */
  hReadPipe = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ReadPipe, hPipeOutputRead, 0, NULL);
  if (! hReadPipe)
  {
    Err_ShowLast(_T("Cannot create thread"));
    goto close_process;
  }

  /* Envoie d'une valeure pour a */
  WriteFile(hPipeInputWrite, "toto\n", 5, &nBytesWritten, NULL);

  WaitForSingleObject(processInfo.hProcess, INFINITE);

  nResult = 0;

  CloseHandle(hReadPipe);
close_process:
  CloseHandle(processInfo.hThread);
  CloseHandle(processInfo.hProcess);
close_output_pipe:
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeInputWrite);
close_input_pipe:
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead); 
the_end:
  ExitProcess(nResult);
  return 0;
}
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Donc dans ton cas, cela servirait à lancer telnet (Le client) pour qu'il se connecte sur VLC et à lui faire envoyer les goto X.

Mais bon en pratique, ça à l'air un peu plus compliqué de travailler avec telnet qu'avec set /P.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Marche aussi avec ftp ->
lstrcpy(lpCommandLine, _T("ftp"));
...
WriteFile(hPipeInputWrite, "help\nquit\n", 10, &nBytesWritten, NULL);

Y a vraiment un souci avec telnet.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Bon bin je n'ai pas trouvé le problème...

Par contre, autre approche, faire directement le client telnet adapté à VLC. Un peu comme ça.
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010

merci pour ces reponses, le client telnet de vlc est galere et ne me permet de faire goto X
mais je suis sur ton code et le compilateur de visual studio me met deux erreurs (void*)&lpMessageBuffer et j'ai mis en commentaire la ligne //typedef unsigned short TCHAR; puis la j'ai l'erreur de lnk 1120 et lnk 2001 peut tu m'expliquer comment mettre l'option /GZ dans le compilateur de visual sutudio
merci
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Pour la 2001, il ne faut pas mettre l'option /GZ, il faut l'enlever. Si tu es sur VC6, c'est dans "Settings" du projet, onglet C/C++, il suffit de la retirer dans "Project Options".

Pour la 1120, il aurait fallut me donner les symboles non trouvés. Mais a priori, il faut que tu ajoutes au moins kernel32.lib et user32.lib en entrée du lieur. "Objects/Library modules" de l'onglet link sous VC6.
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010

j'ai toujours une erreur il me dit
Erreur 3 Ligne de commande error D8016 : options de ligne de commande '/O2' et '/GZ' non compatibles
et /o2 est grisé on ne peut le modifer !
a tu une solution ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
/O2 est une option d'optimisation. Tu dois pouvoir régler le niveau d'optimisation quelque part dans les options.

Mais encore une fois, pour compiler, il faut enlever /GZ, pas le mettre.
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010

euh il y est pas alors !
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Bin c'est parfait, ça devrait compiler donc. Si non, copie colle ici les messages d'erreurs précis.
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010

les voicis j'ai bien mis kernel32.lib et user32.lib

Erreur 3 fatal error LNK1120: 1 externes non résolus C:\Documents and Settings\thejrem\Mes documents\Visual Studio 2008\Projects\tttt\Release\test.exe
Erreur 2 error LNK2001: symbole externe non résolu _main MSVCRT.lib
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Ah, ça c'est parce que tu te link sur MSVCRT.lib (Librairie standard C, CRT) qui cherche _main, autrement dit le main. Mais mon code se compile justement sans CRT et n'a donc pas besoin de main.

MSVCRT.lib est lié par défaut. Il faut dire explicitement à VC de ne pas l'utiliser. Tu as une option qui doit ressembler à "Ignorer les librairies par défaut" dans les options du lieur (-> flag /nodefaultlib).
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010

voici les erreur restante

Erreur 2 fatal error LNK1120: 1 externes non résolus
Erreur 1 error LNK2001: symbole externe non résolu @__security_check_cookie@4

et les option du compilateur sont :

/O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"Release\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt

donc je n'est pas /GZ
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Là c'est encore des symboles qui ne servent à rien qui sont recherchés. C'est effectivement probablement dû à des options de compile...

C'est du C, donc /TP -> /TC. Et le /MD c'est pour sélectionner la runtime C, ce dont tu n'as pas besoin vu que tu as pas de runtime.

Tu as la liste des options ici.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Heu... Au fait, je te rappelle que mon code ne fonctionne pas sur telnet...

A part ça, je vais te faire un projet VC2005 pour demain. Devrait s'importer dans VC2008 sans soucis.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Projet VC2005 posté ici. Entre la config de debug et celle de release, il devrait bien en avoir une qui marche sur VC2008...
Messages postés
26
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
11 juin 2010

merci je vais testé