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

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

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

Ответить
igordz
незнакомец
Сообщения: 6
Зарегистрирован: 12.01.2017 10:57:46

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

Сообщение igordz »

Добрый день, использую 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;


Если в пути к открываемому каталогу нет кирилицы все работает, если кирилица присутствует (как в выше приведенном коде) получаю ошибку. Подскажите как решить, спасибо.
Вложения
Ошибка при наличии кирилицы
Ошибка при наличии кирилицы
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Под виндой можно использовать взамен полного пути с русским т.н. "короткий", например так:

Код: Выделить всё

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
и никаких больше проблем с кириллицей, ивритом или китайскими иероглифами.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

А что функция Utf8ToSys не помогает?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

TProcessUTF8
kit
постоялец
Сообщения: 156
Зарегистрирован: 29.09.2016 08:39:07

Сообщение kit »

При повторном Execute файл будет снова читаться с диска или из памяти?
Аватара пользователя
beria
постоялец
Сообщения: 130
Зарегистрирован: 29.09.2016 07:57:13

Сообщение beria »

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


С диска... но а остальное насколько файл прокеширован средствами ОС
SergK
новенький
Сообщения: 21
Зарегистрирован: 05.03.2011 17:24:51

Сообщение SergK »

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

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 при компиляции. Но вряд ли его надо использовать если Вам это не надо для других нужд.

О результате сообщите ;)
igordz
незнакомец
Сообщения: 6
Зарегистрирован: 12.01.2017 10:57:46

Сообщение igordz »

Всем спасибо, решил с помощью UTF8ToCP1251 и добавлением в uses LConvEncoding. Другие варианты не проверял, так как решил свой вопрос после первого поста. Вариант с короткими именами файлов кажется перспективным из-за "отвязки" от кодировок но хотельсь бы проверить как он отработает при определенных условиях.
Ответить