Shell - "Выражение слишком сложное" и нагорешвие вопросы 2

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Shell - "Выражение слишком сложное" и нагорешвие вопросы 2

Сообщение Rody66 » 11.05.2012 (Пт) 21:40

Здравствуйте.
Вот и набралось достаточное количество вопросов для новой темы. Посему начну. Вопросы упорядочены по приоритету.
1. Правильное английское название полного имени файла - FileName (а может FullName?), так вот, как же тогда правильно называть имя файла с расширением и имя файла без расширения (Name, Title, Caption или что то еще) ?
2. Недавно ф-ция Shell выкинула ошибку Runtime 16 "Выражение слишком сложное", при этом там была запись типа Shell "C:\Programm.exe /au /fn C:\File.txt", как я ни крутил, ошибка так и не отстала. А если перед этим ставил On Error Resume Next, ф-ция выполнялась, но вот только вместо того, чтобы вернуть pID запущенной программы, возвращала 0, хоть файл и запускался. В конце концов пришлось перейти на ShellExecuteEx. Тем не менее, очень интересно по какой причине была эта ошибка.
3. Есть ли разница между Public a и Global a?
4. Какова разница между Str$ и CStr?
5. Почему некоторые апи ф-ции не работают, когда какой-то числовой параметр передается без ByVal? (SendMessage hwnd, msg, 1&, 2& - числа передаются неверно (не те). А вот SendMessage hwnd, msg, ByVal 1&, ByVal 2& работает правильно).
Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Хакер » 11.05.2012 (Пт) 21:57

Rody66 писал(а):так вот, как же тогда правильно называть имя файла с расширением

BaseName.

Rody66 писал(а): и имя файла без расширения

Как хочешь. BasePart или что-нибудь в таком духе.

Rody66 писал(а):3. Есть ли разница между Public a и Global a?

Кроме написания, пока вроде разницы не выявлено. Но возможно разница появится после разработке моего многопоточного кирпича (будет определять, попадает ли переменная в TLS или будет меж-поточной).

Rody66 писал(а):4. Какова разница между Str$ и CStr?

Колоссальная. Str — функция, принимающая Variant, и возвращающая Variant.
CStr — ключевое слово, меняющее тип выражения.
И ещё куча отличий в том, как эти функции обрабатывают входные параметры. Первая принимает только точку в качестве разделителя дробной части, а вторая — руководствуется системными настройками. Первая подставляет пробел перед преобразованным числом.

Rody66 писал(а): Почему некоторые апи ф-ции не работают, когда какой-то числовой параметр передается без ByVal?

Потому что соответствующие аргументы объявлены как As Any, и в отношении таких аргументов справедливо, что параметр всегда передаётся By Ref, кроме случаев, когда явно указано ByVal. Это никак не зависит от API-функций, это зависит только от объявления аргументов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Rody66 » 11.05.2012 (Пт) 22:07

BasePart

А так чтобы попонятнее.. BaseTitle может? Вернее сказать, чтобы переменная чётко суть выражала.
Str — функция, принимающая Variant, и возвращающая Variant.

Речь о Str$, тем не менее, все ясно.

Благодарю за ответы.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Rody66 » 11.05.2012 (Пт) 22:57

И еще один вопрос. Как в контексте: C:\1.txt будет правильно обозначить точку-разделитель между заголовком файла и расширением? Point, Delimiter, Separator ... ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение alibek » 12.05.2012 (Сб) 8:37

Dot
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.05.2012 (Сб) 9:50

This dot is a delimiter :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение alibek » 12.05.2012 (Сб) 11:20

Смысла в определении того, что точка является разделителем, нет.
Других разделителей имени файла и расширения не бывает.
Lasciate ogni speranza, voi ch'entrate.

migor69
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.06.2012 (Вт) 6:36

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение migor69 » 05.06.2012 (Вт) 8:35

поправочка...Довольно странный ответ
--Rody66 писал(а): Почему некоторые апи ф-ции не работают, когда какой-то числовой параметр передается без ByVal?
--
"Потому что соответствующие аргументы объявлены как As Any, и в отношении таких аргументов справедливо, что параметр всегда передаётся By Ref, кроме случаев, когда явно указано ByVal. Это никак не зависит от API-функций, это зависит только от объявления аргументов."
--------
Никаких "As Any"
Просто функция SendMessage принимает 4 значения...2 - как указатели..а последние 2 как значения.....
А ВБ6 всегда (если не указано специально) передает значения в API-функции "By Ref"(как указатель)...
Т.е. SendMessage hwnd, msg, 1&, 2& равнозначно SendMessage ByRef hwnd, ByRef msg, ByRef 1&, ByRef 2&
Для того чтоб правильно передать значения в АПИ, нужно знать.что требует конкретная АПИ
Последний раз редактировалось migor69 05.06.2012 (Вт) 8:42, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Хакер » 05.06.2012 (Вт) 8:36

migor69, не пиши чушь и дезинформацию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

migor69
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.06.2012 (Вт) 6:36

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение migor69 » 05.06.2012 (Вт) 8:45

а вы напишите передачу параметров в эту функцию и посмотрите дебагером..и совсем не обязательно SendMessage..

migor69
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.06.2012 (Вт) 6:36

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение migor69 » 05.06.2012 (Вт) 8:54

As Any самая последняя..Может я что то и подзабыл...Но то что ВБ6 по умолчанию передает в АПИ значения как указатели, это точно...если специально не написать "ByVal"
API-viewer
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
т.е. по указателю передается только последний параметр...As Any который(но не из-за того что он "As Any")..просто 4 параметром передается адрес к структуре LPARAM
SendMessageA(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
Последний раз редактировалось migor69 05.06.2012 (Вт) 8:58, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Хакер » 05.06.2012 (Вт) 8:57

migor69, ты на форуме впервые и вероятно думаешь, что есть какие-то места в VB, которые я могу не знать, как они устроены изнутри. Но пройдёт время, и ты поймёшь, какие отношения связывают меня и внутренности VB.

Ещё раз: твоя «поправочка» — чистейший бред. Фраза «As Any не причём» — чистейший бред. As Any причём. Автор спрашивает, почему то, указано ли ключевое слово ByVal перед аргументом при вызове функции или не указано в некоторых случаях играет роль, а в иных — не играет. Правильный ответ заключается в том, что ключевое слово ByVal, поставленное перед аргументом в строке, в которой осуществляется вызов функции, имеет смысл только для функций, у которых при объявлении конкретный аргумент определён как As Any. Аргументы, объявлынные As Any — единственный случай, когда ByRef-ность/ByVal-ность можно переопределить при вызове. Во всех остальных случаях ByRef-ность/ByVal-ность определяется при объявлении функции и не может быть переопределена при вызове функции.

Так вот разница в работе между SomeFunc 0& и SomeFunc ByVal 0& будет наблюдаться исключительно в том случае, когда первый аргумент функции SomeFunc объявлен как As Any. Всё. Истина. Точка. Ни в каких иных случаях никакой разницы ни у кого пронаблюдать не получится.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Хакер » 05.06.2012 (Вт) 9:10

migor69 писал(а):т.е. по указателю передается только последний параметр...As Any который(но не из-за того что он "As Any")..просто 4 параметром передается адрес к структуре LPARAM

4-ый параметр передаётся по указателю именно потому, что As Any. VB глубоко наплевать на SendMessage, он ничего не знает, что такое SendMessage, не знает, какие аргументы у неё есть и как должны передаваться.

Если параметр объявлен как ByVal x As tpn — он передаётся по значению.
Если параметр объявлен как ByRef x as tpn — он передаётся по ссылке, по указателю.
Если параметр объявлен как x as Any, он передаётся по значению, если ByVal при вызове указано, и по указателю, если не указано.

В первом случае переопределить то, как будет передан параметр, непосредственно при вызове нельзя вообще никогда.
Во втором случае переопределить то, как будет передан параметр, непосредственно при вызове нельзя почти всегда.
И только в третьем случае предполагается, что программист при каждом вызове сам указывает, надо ли ему передавать параметр ByVal или ByRef.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

migor69
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.06.2012 (Вт) 6:36

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение migor69 » 05.06.2012 (Вт) 9:33

похоже я туплю?..по умолчанию "ByRef" касается именно именно As Any
Спасибо что втолковали..Может кому то еще эта тема окажется полезной?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение Хакер » 05.06.2012 (Вт) 9:37

migor69 писал(а):по умолчанию "ByRef" касается именно именно As Any

При вызове аргумент всегда передаётся так, как указано в объявлении, но если в объявлении никак не указано, то по-умолчанию считается, что в объявлении ByRef. Это касается и объявления API-функци, и объявления обчных функций. Это касается всех типов параметров, включая As Any.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Shell - "Выражение слишком сложное" и нагорешвие вопросы

Сообщение ger_kar » 05.06.2012 (Вт) 12:42

Хакер писал(а):Это касается и объявления API-функци, и объявления обчных функций. Это касается всех типов параметров, включая As Any.
Кстати если раньше объявление As Any было возможно только при объявлениях Declare, то теперь совместно с кирпичом Хакера, можно применять As Any для любых процедур и функций если в этом возникнет необходимость, например для решения этой задачи
Плохо, что нельзя указать As Any для возвращаемого функцией значения, а то было бы вообще замечательно.
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33

    TopList