:: Не фоксом единым
Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
поиском такой темы не нашел, но она наверняка есть
Вчера сидели целый день с такой глупостью
Некий сишный екзешник вызывает фоксовый и передает 5 параметров
Первые 4 короткие. А последний некое условие для выборки длинное.
Выяснилось, что при увеличении этого параметра на си в фокс он не приходит даже
урезанным. Пока он меньше некой длины, все хорошо, а как выше некого предела,так все.
Если фоксовый модуль вызвать из самого фокса через do myexe.exe with .....и все эти параметры, даже последний раза в 2 увеличить
Все ок.
Но ни RUN /7 myexe.exe ..... ни shellexec из фокса уже также не пропускают
последний параметр, он просто не приходит даже обрезанным.
Ясно, что это ограничение общей длины параметров, передаваемых в exe
Вчера уже дома мне показалось, что решение есть, отдать последний параметр как ссылку
То есть в вызывающей задаче объявить переменную,
присвоить все это длинное выражение, и отдать на исполнение.
Пришел на работу, как ни изгилялся, ничего не добился
Так и приходит имя переменной, а не ее содержание.
В целом задачу решили через некую таблицу на Оракл,где лежат длинные условия,а
пятым параметром отдаем просто ключ.
Просто стало любопытно, почему такие дрова
Скажем на оракл в запросе можно подсунуть нечто
вроде ?@var, где переменная объявлена в фоксе до такого вызова, а в Оракл она просто присваивается,а тут нет.Особо непонятно, что фоксовая функция
с shellexec открывает любые файлы по очень длинным путям.
То есть, вроде как и нет у нее ограничения на длину параметра.



Исправлено 1 раз(а). Последнее : boba, 10.04.19 09:27
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
microsoft.com
In Command Prompt, the total length of the following command line that you use at the command prompt cannot contain more than either 2047 or 8191 characters (as appropriate to your operating system):
cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
In a batch file, the total length of the following command line that you use in the batch file cannot contain more than either 2047 or 8191 characters (as appropriate to your operating system):
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Общая длина параметров, на которой все рухнуло
250.
CUSL= "(like('76*',d_schet).or.like('76*',k_schet)).and.d_schet!='76330'.and.k_schet!='76330'.and.d_schet!='76194'.and.k_schet!='76194'.and.d_schet!='76294'.and.k_schet!='76294'.and.d_schet!='76340'.and.k_schet!='76340'.and.id_oracle=0"
CMDD = "RUN /7 U:\ARM_SZAK\cli_k\prg\vhdimport.exe WITH 'erpwork', '1', '2019-04', '76' "+'@CUSL'
выше не работает и без @
Ниже работает и с @ и без
**DO U:\ARM_SZAK\cli_k\prg\vhdimport.exe WITH 'erpwork','1','2019-04','76',CMDD
*strrr=['erpwork','1','2019-04','76',"(like('76*',d_schet).or.like('76*',k_schet)).and.d_schet!='76330'.and.k_schet!='76330'.and.d_schet!='76194'.and.k_schet!='76194'.and.d_schet!='76294'.and.k_schet!='76294'.and.d_schet!='76340'.and.k_schet!='76340'.and.id_oracle=0"]
*!***** strrr=[erpwork 1 2019-04 76 @CUSL]
Не работает, но если последний параметр укоротить цифр на 10, то работает
=runanydoc('', 'vhdimport.exe',strrr)
FUNCTION runanydoc
LPARAMETERS tcDocument, cFileName, cParameters
local lnResult

DECLARE INTEGER ShellExecute ;
IN SHELL32.dll ;
INTEGER nWinHandle, ;
STRING cOperation, ;
STRING cFileName, ;
STRING cParameters, ;
STRING cDirectory, ;
INTEGER nShowWindow

**retreive the main VFP window handle (this handle is used by ShellExecute)

DECLARE INTEGER FindWindow ;
IN WIN32API ;
STRING cNull, ;
STRING cWinName
SET STEP ON[
lnResult=ShellExecute(FindWindow( 0, _SCREEN.caption), "Open", cFileName, cParameters, "", 1)

**Error messages if the return value is < 32
IF lnResult < 32
DO CASE
CASE lnResult=2
Wait wind "Iaaa?iue aea oaeea ."
CASE lnResult=31
Wait wind "Iao ia?aaio?eea aey aua?aiiiai oeia oaeeia."
CASE lnResult=29
Wait wind "Iaaicii?ii caionoeou Excel."
CASE lnResult=30
Wait wind "I?eei?aiea o?a caiouaii."
ENDCASE
ENDIF



Исправлено 1 раз(а). Последнее : boba, 10.04.19 13:05
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
"" Существует некоторая путаница в цифрах максимальной длины имени файла в файловой системе NTFS, которую вы можете обнаружить в различных источниках. Для начала, есть абсолютный предел, введенный Windows API, и он составляет 260 символов. Тем не менее, практический пределе меньше, чем 260 символов.

Может это и параметров в вызове касается... Где-то в API счетчик 1-байтовый.
"В лоб" можно попробовать за gzip-ить строку, превратить в BASE64 и передать в качестве параметра. На стороне фокса раз-BASE64-gzip-ить... Будет работать, до каких-то длин немного побольше.

Эксперимент:



Исправлено 1 раз(а). Последнее : of63, 10.04.19 19:25
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
За совет с архиватором спасибо, вряд ли разрешат.
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
DO myprog.exe WITH ...
вообще не запускает нового процесса - это то же самое что и запуск процедуры в рамках текущей программы.

А что фокс не принимает слишком длинную строку запуска - ну так, видать, он написан. Вероятно в стартовом коде (сишном) не предполагается что будет использована командная строка длиннее 250 символов. Это НЕ системное ограничение - чисто фоксовая особенность.

Проще всего, вероятно, скидывать все эти параметры-портяники во временный файл, а собственно "параметром" при запуске фоксового exe передавать имя этого файла.
Если уж по любому нужно "через параметры" то попробуй через АПИ функции их получать. Правда фокс может просто не дойти до запуска собственно фоксового кода - свалится рантайм ещё до начала работы собственно фоксовых команд и всё.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Правда фокс может просто не дойти до запуска собственно фоксового кода - свалится рантайм ещё до начала работы собственно фоксовых команд и всё.

Бред какой-то
Через временный файл все он передаст.
Кстати, есть прикольное свойство в винде, создаваемого файла. Что мол, когда все ссылки на него закроются, то файл самоуничтожится. Это оказалось неприменимо нигде (нигде этого флага в "рабочих" прогах не встречал. Поискал - не нашел спьяну)
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
Это глюк фокса.
Проще всего убрать параметры в главном файле exe и прочитать их вручную
Local argc, argv[1] &&Количество и сами аргументы
argc = 0
argv = NULL
Declare Long GetCommandLineW in kernel32
Declare Long lstrlenW In kernel32 Long lpStr
Declare Long CommandLineToArgvW In shell32 Long lcCmdLineW, Integer@ pNumArgs
Declare LocalFree in kernel32 Long lpAddress
Local lpArgs
lpArgs = CommandLineToArgvW(GetCommandLineW(), @argc)
If lpArgs != 0
If argc > 0
Dimension argv[m.argc]
Local i, lpCur, lnLen, lcStr
For i = 0 to argc - 1
lcStr = Sys(2600, lpArgs + m.i * 4, 4)
lpCur = CtoBin(m.lcStr, "4RS")
lnLen = 2*lstrlenW(lpCur)
lcStr = Sys(2600, lpCur, m.lnLen)
argv[i + 1] = Strconv(m.lcStr,6)
EndFor
EndIf
*the calling application must free the memory used by the argument list when it is no longer needed.
LocalFree(lpArgs)
EndIf
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Дмитрий Петров

Сообщений: 3066
Откуда: Пермь
Дата регистрации: 09.07.2001
Или из файла прочитать параметры. Filetostr()
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Рома.
Спасибо, ваш совет сработал для варианта запуска
shellexec
Действительно все аргументы удалось вернуть.
run /7 somexe.exe ..... с теми же параметрами
не получилось, ну и бог с ним.
Тут пробовал и апострофы в аргументы
добавлять и запятые между аргументами.
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
У меня без param фокс ругается, а с ним может упасть напрочь... вроде как общая длинна команды с параметрами в районе 255 символов валит рантайм в ошибку (больше и меньше - проходят, хотя,естественно, в сами "параметры" main-а не попадают данные).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Игорь.
У меня Фокс не валится и не дает никакой ошибки
Просто при увеличении длины последнего параметра
его тип становится на входе U-unknown
Все выглядит так, ка будто снаружи это параметр и не передавался.
Больше того, функция parameters()
дает 4, а не 5 аргументов.
Все-таки в моем возрасте память уже не та.
Я порылся в своих материалах по курсах по Фоксу,
что я иногда читал в Интерфейсе и на выезде
Так в разделе winipi есть программа
очень похожая на ту, что привел Роман.
Видать я сам когда-то давно знал про эту проблему и было
ее решение. Судя по тексту программы я ее взял где-то на фоксовых сайтах,
а не писал сам.
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я именно про вариант с АПИ. Но чтобы он заработал, нужно чтобы начал исполняться фоксовый код, а он при определённых условиях (какие именно - я указал) вообще не начинает работать.
Да и зачем насиловать и себя и фокс, если через файл передавать набор параметров не составляет никакого труда?


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Может boba круче чем ты )))
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Игорь. Почти у любой задачи есть много решений,
но это у тех, кому нужно сделать.
В данном случае вопрос человеческих отношений
и психологии.
Тут ни апи ни файлы не помогут.



Исправлено 2 раз(а). Последнее : boba, 13.04.19 19:08
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Всегда можно сделать прослойку, хотя бы и банальный cmd который эти самые параметры командной строки примет и поместит в файл, или там в реестр, чтобы соответствующие дебилоиды ничего и не увидели


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Часть на си, которая вызывает фоксовую прогу делал другой человек.
С этим проблемы, а не с передачей файлов или чем-то другим.
Ratings: 0 negative/0 positive
Re: Общая длина параметров, передаваемая EXE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Владимир какая разница что и как там кто-то делал, если можно поставить между этой программой и твоей прослойку и то что она передаёт в параметрах запуска поместить туда, откуда фоксовая программа уже без проблем это достанет?
Не требуется вообще трогать эту сишную прогу.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика