Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / HELP: плагин sLister для Total Commander / 20 сообщений из 20, страница 1 из 1
03.01.2016, 16:51
    #39141621
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Данный плагин не открывает длинные пути файлов (больше 259).
Как я понял это происходит из-за вот этой строчки:
Код: plaintext
1.
if(CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))


т.е., судя по описанию, если первый параметр NULL, то cmd ограничивается 259 символами.
Я попробовал загнать исходники ( есть на сайте автора плагина ) в VS2013 и откомпилить, но так как я не спец (от слова СОВСЕМ) в сишных проектах, то результат ожидаем - пшик.
Спецы помогите решить проблему: откомпилировать исходники, чтобы потом плагин мог установиться, или может кто имеет доступ на форум Total Commander - задать там этот вопрос. Может кто знает Email автора (Egor Vlaznev) - я ему напишу. Прошу любой помощи.
...
Рейтинг: 0 / 0
03.01.2016, 18:56
    #39141651
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Скорее всего из-за этого
Код: plaintext
1.
#define MAX_PATH 260


Если не путаю, это ограничение зашитое в WinAPI.

Как бороться - ХЗ. Укороти пути. Как вариант сначала перейти в папку, затем указать только имя файла.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx lpCommandLine [in, out, optional]

The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters.
Если правильно понял, то возможно так заработает
Код: plaintext
1.
if(CreateProcessW("", cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
...
Рейтинг: 0 / 0
03.01.2016, 20:23
    #39141674
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Dima T,
Проблема в том, что я полный NULL в Си.
Я даже не знаю как из исходников (ничего не изменяя) получить рабочий плагин. То, что у меня получается, не воспринимается Total Commander'ом как плагин. Видимо где-то надо настраивать проект.
Поэтому и просил помощи у специалистов - может кто-то уже делал плагины, и ему не составит труда скомпилить исходники и выдать на выходе готовый плагин без ограничений 259 символов.
...
Рейтинг: 0 / 0
04.01.2016, 15:26
    #39141985
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Привожу результаты своих изысканий в VS2013.
1) Первоначально проект компилировался из исходников, но коммандер не хотел кушать этот плагин.
Причина: функции из DLL экспортировались в виде _ListLoadW@12.
Решил: Подключил .def файл. Оказывается недостаточно просто добавить его в проект :), необходимо явно прописать его в свойствах проекта: Configuration Properties => Linker => Input => Module Difinition File
2) При пошаговой отладке (подключение к процессу Total Commander: DEBUG => Attach to Process... => TOTALCMD.EXE) получились следующие результаты:

а) Плагин РАБОТАЕТ. Файл открывается и отображается корректно (начальное состояние исходника)
Код: plaintext
1.
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 5: Отказано в доступе."
значение cmd: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 2557590 "D:\я111.pdf"

б) Плагин запускается. В окне листера: Ошибка загрузки D:\<...ПОЛНЫЙ путь 266 символов...>.pdf
Код: plaintext
1.
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 5: Отказано в доступе."
значение cmd: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 2950180 "D:\<...ПОЛНЫЙ путь 266 символов...>.pdf"

в) Ошибка компиляции
Код: plaintext
1.
CreateProcessW("", cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"

г) Плагин НЕ работает, даже не запускается
Код: plaintext
1.
CreateProcessW(L"", cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 3: Системе не удается найти указанный путь."
значение cmd: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 460782 "D:\я111.pdf"

д) Плагин запускается. В окне листера: Ошибка загрузки D:\Files
Код: plaintext
1.
CreateProcessW(rpath, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 0: Операция успешно завершена."
значение rpath: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe
значение cmd: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 2361128 "D:\я111.pdf"

Т.е., судя по 2.а, б и д, проблема, видимо, не в CreateProcessW, и код работает правильно???
Прошу специалистов прокомментировать.
...
Рейтинг: 0 / 0
05.01.2016, 14:02
    #39142353
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Стандартный обход проблемы 260 символов — снабжать путь к файлу префиксом \\?\
...
Рейтинг: 0 / 0
05.01.2016, 23:05
    #39142544
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
RWolf ,
Все тоже самое. Немного изменился п.2д
Плагин запускается. В окне листера: Ошибка загрузки D:\<...здесь только директория...>\Files - итого полный путь без имени файла 202 символов + \Files
Код: plaintext
1.
CreateProcessW(rpath, cmd1, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 0: Операция успешно завершена."
значение rpath: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe
значение cmd1: \\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 2294978 "D:\<...ПОЛНЫЙ путь 266 символов...>.pdf"
...
Рейтинг: 0 / 0
06.01.2016, 00:22
    #39142559
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Так как я чайник, то пробовал различные варианты запуска CreateProcessW, поэтому дополню пунктом 3:
а) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 123: Синтаксическая ошибка в имени файла, имени папки или метке тома."
значение cmd: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 1836380 "D:\я111.pdf"

б) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(cmd2, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 123: Синтаксическая ошибка в имени файла, имени папки или метке тома."
значение cmd2: "C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 2622870 "D:\я111.pdf"

в) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(cmd1, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 123: Синтаксическая ошибка в имени файла, имени папки или метке тома."
значение cmd1: \\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 1049864 "D:\я111.pdf"

г) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(cmd1, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 3: Системе не удается найти указанный путь."
значение cmd1: \\?\"C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 787724 "D:\я111.pdf"

д) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(cmd2, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 123: Синтаксическая ошибка в имени файла, имени папки или метке тома."
значение cmd2: "\\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 2491792 "D:\я111.pdf"

е) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(cmd1, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 122: Область данных, переданная по системному вызову, слишком мала."
значение cmd1: \\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 918962 "D:\<...ПОЛНЫЙ путь 266 символов...>.pdf"
...
Рейтинг: 0 / 0
06.01.2016, 09:32
    #39142610
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr2009,
а нафига тебе вообще эта хрень, totall commander?
Far же есть, он лучше на порядок....
...
Рейтинг: 0 / 0
06.01.2016, 10:05
    #39142616
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
В lpApplicationName не должно быть ничего, кроме имени исполняемого файла; параметры командной строки перечисляются в lpCommandLine.
...
Рейтинг: 0 / 0
06.01.2016, 13:36
    #39142698
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
RWolf ,

4а) Плагин НЕ запускается.
Код: plaintext
1.
CreateProcessW(L"SumatraPDF.exe", cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 0 и ошибку: "error 2: Не удается найти указанный файл."
значение cmd: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 525790 "D:\я111.pdf"
. . . . . . . . . или \\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 853380 "D:\я111.pdf"
. . . . . . . . . или "\\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 1050018 "D:\я111.pdf"

4б) Открывается не плагин, а сама Суматра с двумя вкладками: 1836408 и я111.pdf. Сам Total Commander зависает
Код: plaintext
1.
CreateProcessW(rpath, cmd2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 0: Операция успешно завершена."
значение rpath: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe
значение cmd2: -plugin 1836408 "D:\я111.pdf"

4в) Плагин запускается. В окне листера: Ошибка загрузки D:\Files
Код: plaintext
1.
CreateProcessW(rpath, cmd2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 0: Операция успешно завершена."
значение rpath: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe
значение cmd2: \\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe -plugin 2688400 "D:\я111.pdf"

4г) Плагин запускается и КОРРЕКТНО отображает файл
Код: plaintext
1.
CreateProcessW(rpath, cmd2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 0: Операция успешно завершена."
значение rpath: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe
значение cmd2: "\\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 722164 "D:\я111.pdf"
. . . . . . . . . или "C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 394846 "D:\я111.pdf"

4д) Плагин запускается. В окне листера: Ошибка загрузки D:\<...ПОЛНЫЙ путь 266 символов...>.pdf
Код: plaintext
1.
CreateProcessW(rpath, cmd2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)


возвращает 1 и ошибку: "error 0: Операция успешно завершена."
значение rpath: C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe
значение cmd2: "\\?\C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe" -plugin 853236 "D:\<...ПОЛНЫЙ путь 266 символов...>.pdf"

Какие выводы?
1. В lpApplicationName (rpath) должен быть либо NULL (п. 2а), либо ПОЛНЫЙ путь к запускаемой программе (п. 4г)
2. В lpCommandLine (cmd) должен быть ПОЛНЫЙ путь к программе с параметрами командной строки заключенный в КАВЫЧКИ (пп. 4в, 4г)
3. Префикс \\?\ не имеет значения при заполненном параметре lpApplicationName (rpath) (п. 4г)
...
Рейтинг: 0 / 0
06.01.2016, 13:43
    #39142704
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr2009Какие выводы?
Выводы такие, что MSDN надо читать очень внимательно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.01.2016, 13:48
    #39142708
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr20091. В lpApplicationName (rpath) должен быть либо NULL (п. 2а), либо ПОЛНЫЙ путь к запускаемой программе (п. 4г)
Да.
AlexSyr20092. В lpCommandLine (cmd) должен быть ПОЛНЫЙ путь к программе с параметрами командной строки заключенный в КАВЫЧКИ (пп. 4в, 4г)
Кавычки нужны только для разбора строки; если в имениах файлов нет пробелов, кавычки можно не ставить.
AlexSyr20093. Префикс \\?\ не имеет значения при заполненном параметре lpApplicationName (rpath) (п. 4г)
Префикс ставится к длинному имени файла. В любом случае, разбор командной строки всё равно на совести запускаемого приложения, так что префикс может и не пригодиться.
...
Рейтинг: 0 / 0
06.01.2016, 14:29
    #39142724
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Dimitry SibiryakovВыводы такие, что MSDN надо читать очень внимательно.

Наконец-то специалист появился. Как же я Вас долго ждал!
авторThe lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line.
Прокомментируйте, опираясь на результаты пп. 3 б, г и д. и CreateProcess function .
...
Рейтинг: 0 / 0
06.01.2016, 14:54
    #39142733
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr2009Прокомментируйте, опираясь на результаты пп. 3 б, г и д

По всем третьим пунктам: в параметре имени исполняемого приложения - только имя
исполняемого приложения, а ты туда ещё и аргументы напихал. Они воспринимаются как часть
имени файла и, естественно, файл с таким диким именем не находится.
lpApplicationName [in, optional]

The name of the module to be executed.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.01.2016, 15:10
    #39142739
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
[quot Dimitry Sibiryakov]
Еще раз:
The lpCommandLine parameter can be NULL . In that case , the function uses the string pointed to by lpApplicationName as the command line .
Разве командная строка не подразумевает аргументов???
Вполне допускаю, что где-то кавычки не там стоят, но где про это в MSDN написано, да и вроде как я попробовал их по разному ставить.

автор... а ты туда ещё и аргументы напихал ...
А куда тогда их пихать, если lpCommandLine is NULL???
...
Рейтинг: 0 / 0
06.01.2016, 15:42
    #39142747
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr2009Разве командная строка не подразумевает аргументов???
В данном случае - нет.

AlexSyr2009А куда тогда их пихать, если lpCommandLine is NULL???
Аргументы передаются исключительно в lpCommandLine. Выбора нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.01.2016, 15:44
    #39142748
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr2009Еще раз:
The lpCommandLine parameter can be NULL . In that case , the function uses the string pointed to by lpApplicationName as the command line .


Это надо понимать так: можно не указывать, что передать запускаемому приложению в качестве командной строки, тогда эта строка будет по умолчанию заполнена значением lpApplicationName.
...
Рейтинг: 0 / 0
06.01.2016, 16:48
    #39142776
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
По п. 3 вопрос закрыт: INFO: Understanding CreateProcess and Command-line Arguments
авторIf the ApplicationName parameter is passed and the CommandLine parameter is NULL, then the ApplicationName parameter is also used as the CommandLine. This does not mean that you can pass additional command-line parameters in ApplicationName string . For example, the following call will fail with a "File Not Found" error:
Код: plaintext
1.
   CreateProcess( "c:\\MyApp.exe Param1 Param2", NULL, ... )


MS'у влом было написать это в описании функции???

Остается открытым вопрос с длиной командной строки, ограниченной 259 символами - собственно с чего все и началось.
Т.е. имеем 4г (короткий путь) - работает, 4д (длинный) - не работает.
Что скажите? Можно ли в данном плагине что-то сделать для исправления этой ситуации, или это баг самой Суматры?
...
Рейтинг: 0 / 0
06.01.2016, 16:58
    #39142780
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
AlexSyr2009Можно ли в данном плагине что-то сделать для исправления этой ситуации,
или это баг самой Суматры?
Баг Суматры, однозначно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.01.2016, 18:02
    #39142800
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: плагин sLister для Total Commander
Dimitry Sibiryakov ,
Спасибо большое.
Смирился, успокоился
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / HELP: плагин sLister для Total Commander / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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