2013-11-07 16 views
3

Я пытаюсь запустить две из командной строки в программе на C++, но приземлюсь в странной ошибке. Командные строки, которые я хочу запустить, - этоC++ синтаксический анализ командной строки

vlc -vvv dshow:// :dshow-vdev='USB Video Device' :dshow-adev="" :live-caching=50 :sout=#transcode{vcodec=WMV2,vb=800,acodec=wma2,ab=128,channels=2,samplerate=44100}:duplicate{dst=udp{dst=localhost:1234},dst=display} :sout-keep 

vlc -vvv udp://@localhost:1234:network-caching=50 

Оба они нормально работают в командной строке. Но когда используется системный вызов C++ для запуска, первый из них терпит неудачу, где второй работает. Путь я запустить их в C++ выглядит следующим образом:

system("\"G:/Program Files/VideoLAN/VLC/vlc\" -vvv dshow:// :dshow-vdev=\"USB Video Device\" :dshow-adev=\"none\" :live-caching=50 :sout=#transcode{vcodec=WMV2,vb=800,acodec=wma2,ab=128,channels=2,samplerate=44100}:duplicate{dst=udp{dst=localhost:1234},dst=display}:sout-keep"); 

system("\"G:/Program Files/VideoLAN/VLC/vlc\" -vvv udp://@localhost:1234:network-caching=50"); 

первая команда выдает ошибку «G:./Программа не является внутренней или внешней командой, исполняемой программой или пакетным файлом», что странно так как обе команды обрабатывают путь к файлу одинаково. Пожалуйста, дайте мне знать причину этого. Компьютер работает под управлением Windows XP и я с помощью Microsoft Visual Studio 2010.

+0

Добавить \ перед пространством на своем пути. – Zeta

+0

Но во второй команде тоже нет \ перед пространством, но это работает. В любом случае спасибо. Я попробую! – Vigo

+0

Добавление \ не работает! – Vigo

ответ

0

Заменить

system("\"G:/Program Files/VideoLAN/VLC/vlc\" -vvv dshow:// :dshow-vdev=\"USB Video Device\" :dshow-adev=\"none\" :live-caching=50 :sout=#transcode{vcodec=WMV2,vb=800,acodec=wma2,ab=128,channels=2,samplerate=44100}:duplicate{dst=udp{dst=localhost:1234},dst=display}:sout-keep"); 

system("\"G:/Program Files/VideoLAN/VLC/vlc\" -vvv udp://@localhost:1234:network-caching=50"); 

с

system("G:\\\"Program Files\"\\VideoLAN\\VLC\\vlc -vvv dshow:// :dshow-vdev=\"USB Video Device\" :dshow-adev=\"none\" :live-caching=50 :sout=#transcode{vcodec=WMV2,vb=800,acodec=wma2,ab=128,channels=2,samplerate=44100}:duplicate{dst=udp{dst=localhost:1234},dst=display}:sout-keep"); 

system("G:\\\"Program Files\"\\VideoLAN\\VLC\\vlc -vvv udp://@localhost:1234:network-caching=50"); 
+0

Не работает, поскольку путь к файлу считывается как «G: /» Program Files »/ VideoLAN/VLC/vlc». Я думаю, что дополнительные кавычки вызывают проблему. Дает ошибку «Неверное имя файла, имя каталога или синтаксис метки тома». – Vigo

+0

Извините, мой плохой ... отредактировал ответ. – Abhineet

+0

Сообщите мне, если отредактированное решение работает для вас. – Abhineet

0

с помощью system() для выполнения команд имеет следующие предостережения и требования переключателя для что вы пытаетесь (из документации cmd), поскольку она эффективно работает cmd /C *mycommandhere*:

If /C or /K is specified, then the remainder of the command line after 
the switch is processed as a command line, where the following logic is 
used to process quote (") characters: 

    1. If all of the following conditions are met, then quote characters 
     on the command line are preserved: 

     - no /S switch 
     - exactly two quote characters 
     - no special characters between the two quote characters, 
      where special is one of: &<>()@^| 
     - there are one or more whitespace characters between the 
      two quote characters 
     - the string between the two quote characters is the name 
      of an executable file. 

    2. Otherwise, old behavior is to see if the first character is 
     a quote character and if so, strip the leading character and 
     remove the last quote character on the command line, preserving 
     any text after the last quote character. 

Если вы переформатировать свои команды, как:

system("cmd /S /C \"\"c:\\testDir\"\"\\dir with spaces\"\"\\myexe.exe"); 

, который должен работать :) (в предыдущей версии я забыл некоторые спецсимволы).

Существует также related question here.

Или, если это для окон только Вы могли бы использовать ShellExecute или ShellExecuteEx с некоторой документацией на вышеупомянутом на msdn, here

Надеются, что это помогает, как я только что потерял связь с моим домом и не может получить исправленную версию для моего предыдущего исправления в настоящее время, сделают это сегодня вечером.

+0

это дает «Ошибка имени файла, имени каталога или тома». Ошибка! – Vigo

+0

Повторюсь, я набрал правильный формат, возможно, пропустил что-то извинения. – GMasucci

Смежные вопросы