Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.10;
Скачать: CL | DM;

Вниз

Ограничения на длину командной строки   Найти похожие ветки 

 
Inco   (2007-05-13 21:04) [0]

Наткнулся на такую ошибку: ярлычок на мою программу находится в меню "Отправить". Выделяем кучу файлов в Эксплорер, кликаем правой кнопкой на них выбираем "Экспорт в программу" - получаем сообщение об ошибке "Невозможно получить доступ к объекту ...".

По сути делается следующее: при вызове программы из меню "Отправить" - вызывается моя программа, а все пути к выделенным файлам передаются через командную строку. Так вот, если длина командной строки ~2000 символов или более - происходит ошибка, если меньше - все нормально. (Delphi Turbo Explorer, WinXP).

Например, выделим 20 файлов в папке "C:\Documents and Settings\VPetrov\Мои документы\Мои рисунки\Image for conversion\Ready" - получим ошибку. Если их перенести в "С:\Ready" - все работает, как часы!

Самое обидное, что ошибка происходит еще до выполнения первого оператора моей программы!

Что за такое ограничение на длину командной строки? Может кто-то сталкивался с чем-то подобным и поборол?

В Интернете пока не нашел ничего объясняющего этот эффект. Продолжаю поиски.


 
VirEx ©   (2007-05-13 21:18) [1]

а относительные пути в программе сделать слабо?
а указать папку с маской * и воспользоваться findfile слабо?


 
lookin ©   (2007-05-13 21:20) [2]

Уверен, что это баг винды такой, этого говна там навалено тоннами...


 
TUser ©   (2007-05-13 21:21) [3]

Писать конфигурационный файл (мне нравится формат ini, кому-то - xml), и прошграмме передавать имя файла в качестве единственного параметра.


 
antonn ©   (2007-05-13 21:22) [4]


> а относительные пути в программе сделать слабо?
> а указать папку с маской * и воспользоваться findfile слабо?
>

мда...


 
VirEx ©   (2007-05-13 21:26) [5]


>  [4] antonn ©   (13.05.07 21:22)
>
> > а относительные пути в программе сделать слабо?
> > а указать папку с маской * и воспользоваться findfile
> слабо?
> >
>
> мда...

что мда?

> Выделяем кучу файлов в Эксплорер, кликаем правой кнопкой
> на них выбираем "Экспорт в программу"

а что папку нельзя выделить и правой кнопкой "отправить"?
а в программе перечислять по маске стандартным API


 
@!!ex ©   (2007-05-13 21:29) [6]

> [5] VirEx ©   (13.05.07 21:26)
>
> >  [4] antonn ©   (13.05.07 21:22)
> >
> > > а относительные пути в программе сделать слабо?
> > > а указать папку с маской * и воспользоваться findfile
>
> > слабо?
> > >
> >
> > мда...
>
> что мда?
>
> > Выделяем кучу файлов в Эксплорер, кликаем правой кнопкой
>
> > на них выбираем "Экспорт в программу"
>
> а что папку нельзя выделить и правой кнопкой "отправить"?
>
> а в программе перечислять по маске стандартным API


А если нужны не все 500 файлов из папки, а 20 конкретных? Ваши предложения?


 
antonn ©   (2007-05-13 21:31) [7]


> что мда?

дык если ошибка происходит:

> Самое обидное, что ошибка происходит еще до выполнения первого
> оператора моей программы!

какая маска?


 
VirEx ©   (2007-05-13 21:37) [8]


>  [6] @!!ex ©   (13.05.07 21:29)

1) маска, дата изменения, атрибут, не достаточно?
2) GetShortPathName


 
VirEx ©   (2007-05-13 21:38) [9]


> [7] antonn ©   (13.05.07 21:31)

внимательно перечитываем

> [5] VirEx ©   (13.05.07 21:26)


 
homm ©   (2007-05-13 22:01) [10]

2 Inco:
Что такое «Экспорт в программу» ??? У меня нет такого пункта.


 
VirEx ©   (2007-05-13 22:03) [11]


>  [10] homm ©   (13.05.07 22:01)

покопайся в реестре, и появится)


 
homm ©   (2007-05-13 22:08) [12]

> покопайся в реестре, и появится)

Я серьезно, пусть сначала объяснит что это за пункт, ну или кто-то другой, а то я не въезжаю.


 
VirEx ©   (2007-05-13 22:19) [13]

так тут даже реестр править не нужно, добавь ярлык своей программы в папку C:\Documents and Settings\User\SendTo
въехал?


 
homm ©   (2007-05-13 22:41) [14]

Нет. Пункта «Экспорт в программу», ровно как и «Экспорт в…» и прочего экспорта у меня от этого не появилось.


 
Inco   (2007-05-14 10:30) [15]

Извините, что долго отсутствовал
2 homm ©   (13.05.07 22:01) [10]
> Что такое «Экспорт в программу» ??? У меня нет такого пункта.

см. VirEx ©   (13.05.07 22:19) [13]

Заходим в папку "C:\Documents and Settings\VPupkin\SendTo" делаем там ярлык на свою программу (или любую другую) (правда у меня это происходит программным путем при запуске программы).
Теперь кликаем правой кнопкой мыши на любом файле, смотрим меню "Отправить". Вуаля!

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


 
clickmaker ©   (2007-05-14 10:42) [16]


> По сути делается следующее: при вызове программы из меню
> "Отправить" - вызывается моя программа, а все пути к выделенным
> файлам передаются через командную строку

записывай пути в текстовик и передавай его путь как параметр. Наподобие list file для архиватора


 
Inco   (2007-05-14 10:52) [17]

2 clickmaker ©   (14.05.07 10:42) [16]
>записывай пути в текстовик и передавай его путь как параметр. Наподобие list file для архиватора

Я бы рад так сделать, но ошибка происходит ДО ВЫЗОВА ПЕРВОГО ОПЕРАТОРА моей программы.


 
clickmaker ©   (2007-05-14 10:55) [18]


> ошибка происходит ДО ВЫЗОВА ПЕРВОГО ОПЕРАТОРА

ну значит исправлять надо ошибку-то... причем тут ограничения?


 
Inco   (2007-05-14 10:56) [19]

Это происходит не только с моей программой, но и с другими (например, Aditor, Acrobat, Winrar и т.д.).
Получается, что это связано с Windows, а не с моей программой.

Можно ли что-нибудь сделать с настройками Windows, или это не из той области?


 
Inco   (2007-05-14 10:57) [20]

2 clickmaker ©   (14.05.07 10:55) [18]
>ну значит исправлять надо ошибку-то... причем тут ограничения?

+1000


 
clickmaker ©   (2007-05-14 11:15) [21]


> [19] Inco   (14.05.07 10:56)

в любой системе есть свои ограничения. И не только в сфере ИТ.


 
Andy BitOff ©   (2007-05-14 11:36) [22]

Это ивестное ограничение виндов. Не раз сталкивался. Решал именно передачей каталога. Причем самому этого не сделать, поэтому приходилось писать в хелпе (и в саппорте объяснять), что если надо передать программе очень много файлов, то передайте ей каталог, содержащий эти файлы. А уже в программе разбираешь, если передали каталог, то приходится искать все нужные (подходящие программе) файлы.
Ну не заставишь ведь юзера писать конфигурационный файл.


 
Inco   (2007-05-14 11:44) [23]

2 Andy BitOff ©   (14.05.07 11:36) [22]
Понятно. Спасибо.
Я думал о том, что это ограничение виндов, но надеялся, что это не так. Как описано Help для Дельфи функция CmdLine возвращает результат типа PAnsiChar, соответственно, вроде бы ограничений нет.
Но раз я не один столкнулся с такой штукой, видимо, ничего не предпримешь - придется выносить ярлык из меню "Отправить", т.к. не хочется, чтобы пользователя приходилось учить пользоваться программой.


 
Anatoly Podgoretsky ©   (2007-05-14 23:42) [24]

> Inco  (14.05.2007 11:44:23)  [23]

Открой программу с одним файлом, а потом брось в окно остальные, подобной дрессировке поддаются все пользователи


 
Andy BitOff ©   (2007-05-15 08:26) [25]

Да, забыл написать, что у моей программы была такая специфика и обойти это было нельзя. Но есть другой вариант.
Если прописываешься в shell-command (сразу по ПКМ), то метод отсылки выбранных файлов следующий. Для каждого передаваемого файла запускается новая копия приложения. Ну а тут и карты в руки. Первой запущенной копии передаются все остальные параметры. Вот в этом случае ограничений не существует.
Вроде понятно объяснил =) Проснулся только.


 
Inco   (2007-05-15 10:58) [26]

2 Anatoly Podgoretsky ©   (14.05.07 23:42) [24]
> Открой программу с одним файлом, а потом брось в окно остальные, ...

Моя программа работает в 2 режимах:
1. Можно просто ее запустить и в открывшееся окно накидать то, что тебе нужно и сколько угодно (в это же время и создается ярлык в меню "Отправить").
2. Программа не запущена, в папке выбираешь нужные тебе файлы, правой кнопкой щелкаешь, выбираешь меню "Отправить" -> "Экспорт ...", запускается программа и делает все что нужно без лишних телодвижений.

Специфика работы требует, чтобы было как можно меньше действий пользователя для получения результата, соответственно первый режим - увы! - почти никогда не будет использоваться (хотя там много фич - предпросмотр, сортировка, режимы отображения и т.п.).

А второй режим выдает ТАКУЮ ошибку, что его можно считать нерабочим (хотя в половине случаев (при малом кол-ве файлов) он будет работать).

Я думаю копать в сторону добавления пунктов в контекстное меню файлов, как это делает Winrar, Winamp и т.п. Хоть при этом программа уже не будет простая, как пробка (все таки придется писать в реестр и м.б. еще какие-то интересные фичи), но зато этот всеми желанный режим будет работать.


 
Inco   (2007-05-15 11:08) [27]

2 Andy BitOff ©   (15.05.07 08:26) [25]
> Если прописываешься в shell-command (сразу по ПКМ), ... Для каждого передаваемого файла запускается новая копия приложения.

Именно так я и делал, до того как додумался сунуть ярлык в меню "Отправить". Но мне не понравилось как это все работает - для каждого файла грузится .exe объемом 800 кБ, передает имя файла и закрывается. Для 50 файлов занимает довольно продолжительное время, комп в это время тормозит и создается впечатление, что что-то работает не так.
В общем, я от этого отказался и не хочу возвращаться к этому режиму.

2 All
Может ли кто-нибудь подсказать механику работы Winrar или Winamp:
когда выбираешь 200 файлов и по правой кнопке мыши нажимаешь "Создать архив"/"Играть в Winamp" ведь ничего не тормозит и Winrar/Winamp 200 раз не запускается, а список выбранных файлов уже находится у них внутри.
Каким образом это делается?


 
clickmaker ©   (2007-05-15 11:26) [28]


> Может ли кто-нибудь подсказать механику работы Winrar или
> Winamp:

расширения оболочки работают через DragQueryFile, как это делает, к примеру rarext.dll. Это COM-сервер


 
Inco   (2007-05-15 13:40) [29]

Нарыл информации, буду пробовать.

Спасибо всем.



Страницы: 1 вся ветка

Текущий архив: 2007.06.10;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.045 c
4-1167360583
kernel
2006-12-29 05:49
2007.06.10
OnShow чужого приложения


2-1179490046
FIL-23
2007-05-18 16:07
2007.06.10
ПЕРЕХВАТ И ОБРАБОТКА ИСКЛЮЧЕНИЙ


2-1179416461
lavrenty
2007-05-17 19:41
2007.06.10
Log событий


2-1179823907
Lobach
2007-05-22 12:51
2007.06.10
Как получить число из строки


15-1178898672
Ringo
2007-05-11 19:51
2007.06.10
Женюсь, ей-богу женюсь, честное, благородное слово!(Паниковский).