Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / shellexecute русские символы в названии файла / 16 сообщений из 16, страница 1 из 1
04.01.2021, 20:55
    #40033466
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Всем доброго вечера,

Проект в lazarus 2.0.10 в юникоде, Win.10.
при вызове программы через
Код: pascal
1.
2.
3.
sTmpExec: string;
.........
iShellErr := ShellExecute(0, 'open', PChar(sTmpExec), '', '', SW_NORMAL);  


если в имени файла есть кириллица то получаю ответ что iShellErr = 2 - The specified file was not found.
В сети народ рекомендует PChar поменять на PWideChar но компилятор ругается, желает PChar
прошел кликом до определения ShellExecute в ascdef.inc
Код: pascal
1.
function ShellExecute(_para1:HWND; _para2:pchar; _para3:pchar;_para4:pchar; _para5:pchar;_para6:longint):HINST; external 'shell32' name 'ShellExecuteA';  


да, PChar.
Что посоветуете?

Спасибо.
...
Рейтинг: 0 / 0
04.01.2021, 21:09
    #40033467
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Завернуть имя файла в двойные кавычки.
...
Рейтинг: 0 / 0
04.01.2021, 21:14
    #40033468
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
northener
Завернуть имя файла в двойные кавычки.


уже пробовал, не помогло
Код: pascal
1.
2.
            iShellErr := ShellExecute(0, 'open', PChar('"' + sTmpExec + '"'), '', '',
              SW_NORMAL);  


если кириллицы нет то всё открывается
...
Рейтинг: 0 / 0
04.01.2021, 21:26
    #40033470
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
hlopotun
Проект в lazarus 2.0.10 в юникоде,

ShellExecuteW(...)?
...
Рейтинг: 0 / 0
04.01.2021, 21:53
    #40033477
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
А вообще, в лазаре есть LCLIntf.OpenDocument() и SysUtils.ExecuteProcess().
...
Рейтинг: 0 / 0
04.01.2021, 22:14
    #40033482
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Kazantsev Alexey,

какая то фигня
если в uses только
uses Windows
то shellexecute тащит из ascdef.inc
Код: pascal
1.
function ShellExecute(_para1:HWND; _para2:pchar; _para3:pchar;_para4:pchar; _para5:pchar;_para6:longint):HINST; external 'shell32' name 'ShellExecuteA';  



iShellErr := ShellExecute(0, 'open', PChar(sTmpExec), '', '', SW_NORMAL);
С названиями латиницей всё работает, с кирилицей не находит файлы.

если использую ShellExecuteW то тащит из unifun.inc
Код: pascal
1.
function ShellExecuteW(_para1:HWND; _para2:LPCWSTR; _para3:LPCWSTR; _para4:LPCWSTR; _para5:LPCWSTR;_para6:longint):HINST; external 'shell32' name 'ShellExecuteW';



iShellErr := ShellExecuteW(0, 'open', PWideChar(sTmpExec), '', '',
SW_NORMAL);
уже не находит ни с латиницей ни с кириллицей

добавляю в uses windows, ShellApi;

теперь тащит из ShellApi
Код: pascal
1.
Function ShellExecuteW(hwnd: HWND;lpOperation : LPCWSTR ; lpFile : LPCWSTR ; lpParameters : LPCWSTR; lpDirectory:  LPCWSTR; nShowCmd:LONGINT):HInst; external shell32 name 'ShellExecuteW';


iShellErr := ShellApi.ShellExecuteW(0, 'open', PWideChar(sTmpExec), '', '', SW_NORMAL);

опять не находит ни с латиницей ни с кириллицей ....
непонятно что не так
...
Рейтинг: 0 / 0
04.01.2021, 22:50
    #40033492
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Kazantsev Alexey
А вообще, в лазаре есть LCLIntf.OpenDocument() и SysUtils.ExecuteProcess().


спасибо за наводку, OpenDocument выглядит интересно, одиночнае файлы открывает. Непонятно как открыть им к примеру cmd файл с параметром.
ExecuteProcess отрабатывает без проблем.

Спасибо!

кстати, может существует нечто подобное что будет и на других платформах работать?
у OpenDocument вижу только WinCE в директивах и он через ShellExecute тоже работает а ExecuteProcess написан на основе CreateProcessW из kernel32
...
Рейтинг: 0 / 0
04.01.2021, 23:10
    #40033505
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
hlopotun
кстати, может существует нечто подобное что будет и на других платформах работать?

Эти функции кроссплатформенные. Исходники ты видишь только под разрабатываемую платформу.
...
Рейтинг: 0 / 0
04.01.2021, 23:12
    #40033506
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
в принципе решение в OpenDocument можно подсмотреть

Код: pascal
1.
2.
3.
4.
  ws: WideString;     
..............
ws := UTF8Decode(AURL);
    Result := ShellExecuteW(0, nil, PWideChar(ws), nil, nil, SW_SHOWNORMAL) > 32;  
...
Рейтинг: 0 / 0
04.01.2021, 23:20
    #40033508
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Вообще-то функции "W" или "A" никто не должен вызывать напрямую. Они дожны автоматически ресолвиться в зависимости от типа проекта - unicode, asci. Кривизна какая-то.
...
Рейтинг: 0 / 0
04.01.2021, 23:23
    #40033509
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Relic Hunter,

Так и будет, когда FPC на юникод переедет.
...
Рейтинг: 0 / 0
05.01.2021, 02:13
    #40033536
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
hlopotun,

рекомендую еще вики фпц по теме почитать:
https://wiki.lazarus.freepascal.org/Executing_External_Programs#TProcess
...
Рейтинг: 0 / 0
05.01.2021, 12:04
    #40033575
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
makhaon
hlopotun,

рекомендую еще вики фпц по теме почитать:
https://wiki.lazarus.freepascal.org/Executing_External_Programs#TProcess

Если быть более точным, то лучше TProcessUTF8.
...
Рейтинг: 0 / 0
05.01.2021, 15:32
    #40033642
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Док
makhaon
hlopotun,

рекомендую еще вики фпц по теме почитать:
https://wiki.lazarus.freepascal.org/Executing_External_Programs#TProcess

Если быть более точным, то лучше TProcessUTF8.

А есть ли в delphi аналог Tprocess и TprocessUtf8 ?
...
Рейтинг: 0 / 0
05.01.2021, 17:25
    #40033662
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
hlopotun
Док
пропущено...

Если быть более точным, то лучше TProcessUTF8.

А есть ли в delphi аналог Tprocess и TprocessUtf8 ?

А он там нужен? Эта обёртка пишется за 15 минут.
...
Рейтинг: 0 / 0
11.01.2021, 11:18
    #40034821
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shellexecute русские символы в названии файла
Если нужно не открывать файлы с данными в ассоциированных программах, а запускать процесс, то всякие Shell обертки надо выкинуть и юзать честный CreateProcess (или кросс-платформенный TUTF8Process)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / shellexecute русские символы в названии файла / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]