2013-12-20 1 views
1

У меня есть этот код:Delphi xe5 ShellExecute неанглийских символов

var 
    sciezkaDysk : string; 
begin 
    sciezkaDysk :='/c ffmpeg.exe MORE_COMMANDS_HERE -f flv "E:\ół test\test.flv"' 
    ShellExecute(0, nil, 'cmd.exe', PWideChar(sciezkaDysk), '', SW_HIDE); 
end; 

проблема с именем каталога «Ol тест», когда имя каталога оленья кожа содержит не английские символы все хорошо работает. Пожалуйста помоги. Спасибо.

+0

Этот [post] (http://stackoverflow.com/questions/2951785/how-can-i-convert-a-unicode-path-to-a-c-string) может быть полезен. –

+0

Каковы значения функций 'GetACP()' и 'GetOEMCP()' windows? –

+0

Зачем вам нужно маршрутизировать его через CMD? попробуйте 'ShellExecute (0, nil, 'ffmpeg.exe', PWideChar ('MORE_COMMANDS_HERE -f flv" E: \ ól test \ test.flv "'), '', SW_HIDE);' –

ответ

4

Проблема не в коде Delphi. Вполне возможно, что ваш исполняемый файл ffmpeg использует GetCommandLineA, а не GetCommandLineW, чтобы прочитать командную строку, и сбой преобразования из UTF-16 в ANSI.

Существуют различные варианты, но я скорее подозреваю, что самым легким будет указать рабочий каталог для нового процесса в каталог, содержащий файл. Таким образом ffmpeg не нужно видеть неприятные персонажи - ShellExecuteW с ними дело:

ShellExecute(
    0, 
    nil, 
    'ffmpeg.exe', 
    'MORE_COMMANDS_HERE -f flv test.flv', 
    'E:\ół test', 
    SW_HIDE 
); 

То есть, я хотел бы предложить, что CreateProcess это лучший способ, чтобы начать внешний процесс. Таким образом, вы получаете больше контроля. Вы можете более четко убедиться, что окно консоли не отображается.

+0

«указать рабочий каталог» - и сбой, если нелатинские символы будут находиться в имени файла не только в имени папки :-) Предполагалось, что в topicstarter нет ANSI CP <> CP CP trap. Или что ffmpeg на базе Linux не принимает никаких данных в UTF-8 ... или что-то еще. –

+0

@ Arioch'The Да, если имя файла содержит символы не ASCII, это может привести к ошибке. –

+0

Спасибо Дэвиду Хеффернану. Теперь работает. Имя файла будет только с английскими символами, только директив может быть изменен. – user3075132