Страница 1 из 1

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

СообщениеДобавлено: 13.02.2017 18:01:28
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;


Если в пути к открываемому каталогу нет кирилицы все работает, если кирилица присутствует (как в выше приведенном коде) получаю ошибку. Подскажите как решить, спасибо.

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

СообщениеДобавлено: 13.02.2017 18:20:43
vitaly_l

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
и никаких больше проблем с кириллицей, ивритом или китайскими иероглифами.

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

СообщениеДобавлено: 14.02.2017 09:18:48
Ichthyander
А что функция Utf8ToSys не помогает?

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

СообщениеДобавлено: 14.02.2017 10:49:00
alexs
TProcessUTF8

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

СообщениеДобавлено: 14.02.2017 12:39:48
kit
При повторном Execute файл будет снова читаться с диска или из памяти?

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

СообщениеДобавлено: 14.02.2017 14:12:03
beria
kit писал(а): читаться с диска или из памяти?


С диска... но а остальное насколько файл прокеширован средствами ОС

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

СообщениеДобавлено: 14.02.2017 20:46:10
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 при компиляции. Но вряд ли его надо использовать если Вам это не надо для других нужд.

О результате сообщите ;)

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

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