Запуск внешних программ и кирилица

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Запуск внешних программ и кирилица

Сообщение igordz » 13.02.2017 18:01:28

Добрый день, использую Windows Xp, Lazarus 1.6.2, FPC 3.0.0
Для открытия каталога в проводнике использую код

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  AProcess: TProcess;
begin
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := 'explorer.exe C:\Отдел продаж\Январь\';
  AProcess.Options := AProcess.Options + [poWaitOnExit];
  AProcess.Execute;
  AProcess.Free;
end;


Если в пути к открываемому каталогу нет кирилицы все работает, если кирилица присутствует (как в выше приведенном коде) получаю ошибку. Подскажите как решить, спасибо.
Вложения
TProcess.JPG
Ошибка при наличии кирилицы
igordz
незнакомец
 
Сообщения: 6
Зарегистрирован: 12.01.2017 11:57:46


Re: Запуск внешних программ и кирилица

Сообщение Снег Север » 13.02.2017 19:33:04

Под виндой можно использовать взамен полного пути с русским т.н. "короткий", например так:
Код: Выделить всё
function GetShortFilename(const AFileName: widestring): widestring;
var
   buffer: array[0..MAX_PATH-1] of widechar;
begin
     FillChar(Buffer, SizeOf(Buffer), #0);
     if GetShortPathNameW(PWideChar(AFileName), @Buffer[0], SizeOf(Buffer)) > 0 then
      Result := WideString(Buffer)
     else
      Result := ''
end;


пример - путь
C:\Users\sneg\projects\lazarus\SLEMsoft\open_utf8_path\Вася Пупкин\הרישון לקיון\מי эден.txt
превращается в
C:\Users\sneg\projects\lazarus\SLEMsoft\OPEN_U~1\E8E5~1\E72E~1\D6F3~1.TXT
и никаких больше проблем с кириллицей, ивритом или китайскими иероглифами.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Запуск внешних программ и кирилица

Сообщение Ichthyander » 14.02.2017 09:18:48

А что функция Utf8ToSys не помогает?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Запуск внешних программ и кирилица

Сообщение alexs » 14.02.2017 10:49:00

TProcessUTF8
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Запуск внешних программ и кирилица

Сообщение kit » 14.02.2017 12:39:48

При повторном Execute файл будет снова читаться с диска или из памяти?
kit
постоялец
 
Сообщения: 156
Зарегистрирован: 29.09.2016 09:39:07

Re: Запуск внешних программ и кирилица

Сообщение beria » 14.02.2017 14:12:03

kit писал(а): читаться с диска или из памяти?


С диска... но а остальное насколько файл прокеширован средствами ОС
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: Запуск внешних программ и кирилица

Сообщение SergK » 14.02.2017 20:46:10

Попробуйте так

procedure TForm1.Button1Click(Sender: TObject);
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := UTF8ToCP1251 ('explorer.exe C:\Отдел продаж\Январь\');
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;

Не забудьте добавить LConvEncoding в Uses !!!
C UTF8ToSys будет работать, только если версия FPC < 3.0 (т.е. не в Вашем случае) или если используете ключ -dDisableUTF8RTL при компиляции. Но вряд ли его надо использовать если Вам это не надо для других нужд.

О результате сообщите ;)
SergK
новенький
 
Сообщения: 19
Зарегистрирован: 05.03.2011 18:24:51

Re: Запуск внешних программ и кирилица

Сообщение igordz » 16.02.2017 11:23:53

Всем спасибо, решил с помощью UTF8ToCP1251 и добавлением в uses LConvEncoding. Другие варианты не проверял, так как решил свой вопрос после первого поста. Вариант с короткими именами файлов кажется перспективным из-за "отвязки" от кодировок но хотельсь бы проверить как он отработает при определенных условиях.
igordz
незнакомец
 
Сообщения: 6
Зарегистрирован: 12.01.2017 11:57:46


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru