Lire élément X dans une playlist VLC

cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010 - 23 févr. 2010 à 11:24
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010 - 26 mars 2010 à 13:20
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
28 févr. 2010 à 12:02
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;
}
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
28 févr. 2010 à 12:09
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
28 févr. 2010 à 12:24
Marche aussi avec ftp ->
lstrcpy(lpCommandLine, _T("ftp"));
...
WriteFile(hPipeInputWrite, "help\nquit\n", 10, &nBytesWritten, NULL);

Y a vraiment un souci avec telnet.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
28 févr. 2010 à 12:40
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010
16 mars 2010 à 14:13
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 mars 2010 à 14:26
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.
0
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010
17 mars 2010 à 12:14
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 ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 mars 2010 à 16:04
/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.
0
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010
17 mars 2010 à 16:14
euh il y est pas alors !
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 mars 2010 à 16:17
Bin c'est parfait, ça devrait compiler donc. Si non, copie colle ici les messages d'erreurs précis.
0
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010
17 mars 2010 à 20:44
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 mars 2010 à 09:17
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).
0
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010
24 mars 2010 à 16:44
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 mars 2010 à 17:04
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 mars 2010 à 17:12
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
25 mars 2010 à 10:39
Projet VC2005 posté ici. Entre la config de debug et celle de release, il devrait bien en avoir une qui marche sur VC2008...
0
cs_thejrem Messages postés 26 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 11 juin 2010
26 mars 2010 à 13:20
merci je vais testé
0