Вопрос по Пользовательскому типу данных (VB6)

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 21.04.2012 (Сб) 19:48

Хакер писал(а):Подчёркиваю: что эти три случая — те редкие случаи, когда проект, использующий TLB, становится зависимым от TLB, и TLB нужна после компиляции. В 99,99 % случаев TLB после компиляции не нужна (скомпилированный файл от неё не зависит и носить её с собой не нужно). Но в этом — нужна.

подозреваю, что тлб не только нужна, но и ещё должна быть зарегистрирована? Лучше уж длл.
Артур
 
   

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 21.04.2012 (Сб) 19:55

arthur2 писал(а):подозреваю, что тлб не только нужна, но и ещё должна быть зарегистрирована?
Ты примеры Хакера пробовал запускать?
Собственно они прекрасно работают и без регистрации TLB. Просто скачал, запустил, получил результат, никакой регистрации и в помине не проводилось, значит можно просто положить тлбшку в папку с приложением. arthur2, а как тебе последняя информация из поста Хакера, про динамические UDT передаваемые в строке? Прикольно конечно, только вот где это можно на практике применить даже не знаю.
Бороться и искать, найти и перепрятать

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение NashRus » 21.04.2012 (Сб) 21:56

zoo = CreateNewUDT("Type ABSOLUTELY_NEW_UDT: a as long: b as integer: c as double: End Type", 44, 55, 66)


Прикольно. Еще прикольно было бы посмотреть на CreateNewUDT.

Еще прикольно было бы типа того:

Код: Выделить всё
Dim o As DynObject1
Set o = CreateNewDynObjectFromXML("PathToXML", "DynObject1") ' не важно как объект создавать, главное чтобы был
o.SomeProp = 1
Msgbox o.SomeProp


и чтобы интелисенс работало.
Типа того, как в VB дизайнер подключения к БД типы генерит в дизайне.
Я в свое время так и не дотумкал до этого.

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 22.04.2012 (Вс) 3:34

arthur2 писал(а):подозреваю, что тлб не только нужна, но и ещё должна быть зарегистрирована? Лучше уж длл.

Должна. Но что значит «лучше уж DLL»!? Если ты о первом варианте, то в нём DLL нужна исключительно как носитель TLB внутри себя. И соответственно, регистрация тоже нужна. Или ты о какой-то другой DLL? О какой?

Вообще, это неописуемая истерия. Я больше пойму линуксоида, ненавидящего Windows, чем Windows-программиста, ненавидящего механизм регистрации. Прямо какая-то армия людей, которые «нужна регистрация» воспринимают хуже чем «нужно заплатить 10 миллионов долларов куда-то-там».

NashRus писал(а):Прикольно. Еще прикольно было бы посмотреть на CreateNewUDT.

Может быть, я напишу кирпич DynaStruct, когда закончу многопоточный кирпич :) Код в принципе простой — нужно создать класс, в нём Implements IRecordInfo, сделать реализацию IRecordInfo, в Variant-переменную пару указателей: на данные структуры и на экземпляр нашего класса. Всё. Правда в кирпиче я обойдусь без класса, если буду делать.

NashRus писал(а):' не важно как объект создавать, главное чтобы был

Так тебе нужен объект с заданным набором свойств или структура с заданным набором полей? Это разные вещи, одинаково выглядящии с позиции исходного кода, работающего с ними.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение NashRus » 22.04.2012 (Вс) 3:49

Хакер писал(а):Так тебе нужен объект с заданным набором свойств или структура с заданным набором полей? Это разные вещи, одинаково выглядящии с позиции исходного кода, работающего с ними.


Я не очень помню как это выглядело в VB-ом дизайнере для работы с БД, но смысл примерно такой, что это являлось прообразом ORM.

Т.е. нужны типизированные поля, спроецированные откуда либо, например поля БД (скорее сами поля и их типоразмер берутся из метаданных, которые отдельная независимая сущность в виде файла какого-либо формата или сервиса в инете или третья БД или т.д.).

Понятно, что поля это свойства и достаточно UDT VB6, но можно предусмотреть и предопределенные действия в этой динамической сущности, но это надо смотреть конкретно задачу.

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 22.04.2012 (Вс) 3:59

Нет.
Одно дело иметь объект с динамическим набором свойств. Это легко, и это делало куча людей. Суть объекта с динамическим набором свойств в том, что у него определяемый пользователем внешний интерфейс, и совершенно неизвестный пользователю внутренний интерфейс и организацию.

От объекта с динамическим набором свойств требуют только две вещи: чтобы он имел нужный набор полей (доступных извне), и чтобы он хранил данные, присвоенные свойствам. Как именно он хранит эти данные внутри себя, как именно он поддерживает сведения о наборе свойств, которые должны быть видимы извне — никто не знает, никто не должен знать, никого не волнует и не должно волновать. Объект — чёрный ящик. Главное набор свойств доступных извне и способность хранить данные.

Совершенно другое дело — структура с динамическим набором полей. Здесь первостепенное значение имеет не внешний интерфейс, а то, как данные упаковываются и лежат в памяти. Тип и порядок следования полей. Например мы передаём структуру API-функции. API-функция предполагает, что нужные данные будут лежать по нужным смещениям и в нужном формате. Я уверен, что UDT, формат (структура) которых определяется динамически, которые с одной стороны можно заполнить на стороне VBScript-компонента, а с другой стороны — передать в API-функцию, кроме меня ещё никто не делал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 22.04.2012 (Вс) 5:36

Где я говорил про то, что не хочу ничего регистрировать? Просто, регистрация длл - стандартное действие при инстилляции. А как стандартно регистрировать тлб - я не очень представляю.
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 22.04.2012 (Вс) 5:40

ger_kar писал(а):Собственно они прекрасно работают и без регистрации TLB.
Ты просто не внимательно прочитал объяснения хакера - тлб нужна как раз для того, чтобы пользовательский тип был зарегистрирован. А как он может быть зарегистрирован, если не зарегистрирована тлб, в которой он описан? В среде примеры работают, потому что при первом же запуске примера тлб, подключенная к проекту, регистрируется бейсиком.
Артур
 
   

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 22.04.2012 (Вс) 5:51

arthur2 писал(а): В среде примеры работают, потому что при первом же запуске примера тлб, подключенная к проекту, регистрируется бейсиком.
Какая хитрая однако среда...
Бороться и искать, найти и перепрятать

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 22.04.2012 (Вс) 6:20

arthur2 писал(а):просто, регистрация длл - стандартное действие при инстилляции. А как стандартно регистрировать тлб - я не очень представляю.

Такое же стандартное действие.
Если для регистрации DLL нужно подгружать её в своё АП и вызывать функцию DllRegisterServer, то для регистрации TLB достаточно стандартной API-функции RegisterTypeLib или же LoadTypeLibEx с флагом REGKIND_REGISTER. Любой уважающий себя инсталлятор обязан уметь регистрировать tlb-шки.
Ну и подобному тому, как для регистрации DLL есть утилита regsvr32, для регистрации TLB есть утилита regtlib. Так что никаких проблем.

arthur2 писал(а):В среде примеры работают, потому что при первом же запуске примера тлб, подключенная к проекту, регистрируется бейсиком.

Нет. Просто студия ищет TLB по имени файла, которое содержится внутри vbp-файла, а скомпилированный файл использует GetRecordInfoFromGuids, используя пару UUID-ов: LIBID библиотеки типов и UUID самого UDT. Именно для этой цели UDT должен быть снабжён UUID-ом, и именно по этой причине не получалось использовать UDT-шки из тех TLB-шек, в которых UDT-шкам не был присвоен UUID.
—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: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 22.04.2012 (Вс) 6:47

Хакер писал(а):Нет. Просто студия ищет TLB по имени файла, которое содержится внутри vbp-файла, а скомпилированный файл использует GetRecordInfoFromGuids, используя пару UUID-ов:
Вот все таки разработчики не додумали и не реализовали такую вещь как первоначальный поиск в директории приложения. Надо было сначала поискать там и если нет, то искать уже по регистрации в реестре. Как это делает студия.
Бороться и искать, найти и перепрятать

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 22.04.2012 (Вс) 6:49

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

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 22.04.2012 (Вс) 6:52

Хакер писал(а):Нет.
И тем не менее, незарегистрированная тлб после запуска проекта, к которому она подключена, становится-таки зарегистрированной :)
Артур
 
   

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 22.04.2012 (Вс) 7:16

Хакер писал(а):На надо. Это не вникаешь в идеологию, в соответствии с которой, для идентификации используются исключительно 128-битные идентификаторы. Никаких строковых имён, вроде имён сущностей или имён файлов.

Все можно бы-ло бы сделать при желании. Идентификаторы нужны исключительно для однозначности и это удобно если ты работаешь с компонентом о котором ничего не известно, кроме его идентификатора. Но здесь идет речь о другом, однозначность бы реализовывалась в этом случае самим программистом. По сути регистрация нужна, что-бы по идентификатору найти нужную библиотеку. Если я собираюсь например работать со своей библиотекой и ни с какой другой и сам определяю ее местонахождение, то нафига мне регистрация? Или пусть будет регисрация, но в фоне. Т.е. почему бы не реализовать такой механизм, не нашлась запись в реестре, приложение перебрало все библиотеки, проверила у них идентификаторы, при нахождении искомого элемента произвела регистрацию, далее уже стандартное обращение. Это конечно можно сделать и самостоятельно, но лучше если бы это было изначально реализовано так. Правильно это или не правильно не знаю, спорить и тем более утверждать или убеждать ничего и не кого не хочу, просто высказал свои субъективные пожелания. Мне нравиться именно так. Все остальное по сути абсолютно не важно ибо то что я сказал удобно, а если удобно (не для программиста ему как раз пофигу должно быть, а для юзера) то значит хорошо!
Бороться и искать, найти и перепрятать

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 22.04.2012 (Вс) 7:17

arthur2 писал(а):И тем не менее, незарегистрированная тлб после запуска проекта, к которому она подключена, становится-таки зарегистрированной
Да именно так! Регистрация в фоне в момент первого запуска! Что-бы так было всегда и у всех, и всем было бы хорошо!
Бороться и искать, найти и перепрятать

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 22.04.2012 (Вс) 7:53

ger_kar писал(а):сли я собираюсь например работать со своей библиотекой и ни с какой другой и сам определяю ее местонахождение, то нафига мне регистрация?

Вот видишь, не догоняешь.
Собрались как-то один раз хорошие люди и решили ввести разделный сбор мусора, и ввели. Стекло — отдельно. Пластик — отдельно. Бумага — отдельно. А выбрасывание всего в один контейнер подвергли критике и запретили. Молодцы.

Вот так и тут. Собрались как-то хорошие люди и решили ввести использование 128-битных идентификаторов для идентификации всего и вся. А использование имён файлов подвергли критике и запретили. И это правильно. Молодцы.
—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: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 22.04.2012 (Вс) 10:04

Хакер писал(а):И это правильно. Молодцы.
Не все правильное бывает удобно, а бывает и совсем уж самое правильное бывает одновременно и самым неудобным. И опять же правильное с одной стороны бывает не очень правильно с другой. Все зависит от угла зрения под которым на это смотреть. Приведу тебе твой же пример с мусором только с другого бока.
Хакер писал(а):А выбрасывание всего в один контейнер подвергли критике и запретили. Молодцы.
Хорошо? Конечно хорошо, кто-бы спорил, но если эти молодцы так радели за раздельное, нафига опять же сами все свалили в одну кучу? Какая куча? А такая. Система как фундамент и весть установленный софт с настройками регистрацией и прочим и все в одной куче. Надо переустановить систему надо переустанавливать и перенастраивать все! Где же тут принцип раздельности? И где принцип лени? А хорошо было бы если бы все как раз таки было раздельным. Система отдельно и не просто система опять вся в куче, а тоже отдельно ядро и его компоненты, отдельно сервисы и так далее, софт, тоже отдельно. И все это взаимодействие осуществлять самонастраивающимися связями, на основе тех же идентификаторов, для однозначности.
Если папка System32, то там исключительно системные компоненты, истино системные и ничего кроме них, никаких утилит, никаких калькуляторов и прочей хрени, для этой хрени отдельная папка. Софту тоже нечего туда писать, у каждого софта своя директория и т.д. Загнулась система, переустановил ее - все! максимум дополнительная установка драйверов, но драйвера это не прикладной софт - это по сути не неотъемлемая часть системы. Вот тебе и принцип раздельности и принцип лени и собственно удобство. Мне это видится под таким углом. Что касается восстановления связей, то вариантов вагон...
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 28.04.2012 (Сб) 19:57

Хакер писал(а): Мне даже обидно за то, какую работу проделали неизвестные герои, чтобы всё это поддерживалось и работало, в то время как вы просто отрицаете существование всех этих возможностей
Интересно, почему эти нормальные герои всегда идут в обход? Раз уж есть возможность впихнуть в вариант пользовательский тип, почему бы этим неизвестным героем было не устроить так, чтобы это действие было элементарным, без танцев с бубном? В чем был смысл так всё усложнять? Героизм неизвестных героев сильно преувеличен.
Артур
 
   

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 19:59

Я не понимаю, о чём ты.
—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: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 28.04.2012 (Сб) 20:07

arthur2 писал(а):почему бы этим неизвестным героем было не устроить так, чтобы это действие было элементарным, без танцев с бубном?
Ну очевидно это про то, что пользовательский тип, например можно объявить в модуле, но для того, что-бы его запихнуть в вариант, такого объявления явно недостаточно, непременно ему подавай TLB, да не простую, а с уникальными идентификаторами. Видимо это и имелось ввиду.
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 28.04.2012 (Сб) 20:13

Видимо, это :D
Артур
 
   

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 20:44

Я не понимаю, какая муха укусила Артура, но в рамках этого топика и одного другого топика (про конвертацию в LARGE_INTEGER) он себя как-то необычно и странно, как будто вдруг у него появилось достаточно знаний для того, чтобы со своей позиции оценивать решения как правильные или неправильные, и обзывать какие-то решения как недостаточно хорошие. Проблема только в том, что у Артур всё-таки не является настолько профессионалом, чтобы судить о таких вещах, и с его стороны хорошим тоном было бы просто слушать и принимать информацию как есть, ну или задавать вопросы «а можно ли сделать это как-то получле», но уж никак не вести себя так, как он себя ведёт.

Это классический сценарий, когда кто-то не разбирающийся глубоко в какой-то области видит какое-то решение из этой области и начинает заявлять: ооо!!! Они всё сделали через задницу и слишком сложно!!! Я бы сделал всё сто раз проще!!!

Непрофессионал неэлектронщик увидел схему блока компьютерного блока питания:
Изображение

Вот дебилы! Зачем они всё таки усложинили!? — восклицает непрофессионал.
Я бы сделал всё просто, вот так:
stupid_power_suply_design.PNG
stupid_power_suply_design.PNG (2.66 Кб) Просмотров: 7893





Непрофессионал видит схему электровоза ЧС7:
Изображение

Зачем так сложно? Для чего так сложно? Ради чего так сложно? Почему бы не сделать просто вот так:
stupid_dc_ele_loco.PNG
stupid_dc_ele_loco.PNG (4.74 Кб) Просмотров: 7893



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


Так вот, какие к черту танцы с бубнами?
Нельзя объявлять функцию внутри другой функции.
Нельзя объявлять переменную между двумя функциями.
Много чего нельзя.
И в этот список входит одно ни чем не выделяющееся среди других «нельзя»: нельзя, чтобы UDT, который покидает границы нашего приложения, был объявлен как приватный.

Если соблюдение нормальных здравых ограничений языка для вас является танцами с бубнами — я не знаю, кто вы, и что вас посоветовать.
—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: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 20:47

По крайней мере, можете написать, как по вашему должны были сделать разработчики VB. А я затем напишу, почему разработчики молодцы, и почему вы ступили почему нельзя сделать так, как вы хотите.
—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: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 28.04.2012 (Сб) 20:54

Хакер писал(а):нельзя, чтобы UDT, который покидает границы нашего приложения, был объявлен как приватный.
А почему собственно он должен обязательно покидать границу приложения? Он конечно может и покинуть, но может и не покидать, как в случае со StandartEXE. Для этого варианта, когда границы не покидает, можно было бы без TLB обойтись?
Бороться и искать, найти и перепрятать

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 20:58

ger_kar писал(а):А почему собственно он должен обязательно покидать границу приложения? Он конечно может и покинуть, но может и не покидать, как в случае со StandartEXE. Для этого варианта, когда границы не покидает, можно было бы без TLB обойтись?

Он может её покинуть в любом случае. Нет возможности отслеживать, куда уйдёт значение каждой конкретной Variant-переменной, имеющеся в нашей программе. То есть кончено возможность есть, но разработчики VB должны были бы бы конченными идиотами, чтобы сделать так, что откомпилированная программа сама же следит за «движением» Variant-значений между Variant-переменными, и поднимала бы тревогу, если Variant-значение может уйти в чужую программу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Qwertiy » 28.04.2012 (Сб) 21:10

Хакер писал(а):И в этот список входит одно ни чем не выделяющееся среди других «нельзя»: нельзя, чтобы UDT, который покидает границы нашего приложения, был объявлен как приватный.

В такой формулировке всё понятно и логично.
А если по-другому: почему нельзя объявить не приватный тип?

Хакер писал(а):Нельзя объявлять функцию внутри другой функции.
Нельзя объявлять переменную между двумя функциями.

Это что плюс такой что-ли? В других языках можно.

ger_kar писал(а):А почему собственно он должен обязательно покидать границу приложения?

Думаю, вариантную переменную можно передать куда угодно (где принимается Variant), поэтому тот код, который её получит должен быть способен определить, что именно он получил.

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 21:14

Qwertiy писал(а):А если по-другому: почему нельзя объявить не приватный тип?

Почему нельзя-то?

Qwertiy писал(а):Это что плюс такой что-ли? В других языках можно.

Это не плюс, и не минус, это специфика конкретного языка. И да, я не знаю языков, где можно определить переменную между функциями, кроме скриптовых языков. И да, в языках того же класса, что и VB (то есть С, С++, Дельфи) тоже нельзя объявить функцию внутри функции.
—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: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 28.04.2012 (Сб) 21:23

Хакер писал(а):И да, в языках того же класса, что и VB (то есть С, С++, Дельфи) тоже нельзя объявить функцию внутри функции.
А в каких можно? Я почему-то считал что это не одном языке не прокатит. Да и зачем оно нужно такое извращение, объявлять процедуру внутри другой процедуры. Это что объявленная внутри будет локальной процедурой, которую можно вызвать только из родительской процедуры?
Бороться и искать, найти и перепрятать

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

Сообщение Qwertiy » 28.04.2012 (Сб) 21:29

Хакер писал(а):Почему нельзя-то?

Ну если бы было можно, то отдельно скомпилированная tlb бы не понадобилась :)

Хакер писал(а):И да, я не знаю языков, где можно определить переменную между функциями, кроме скриптовых языков.

Си же позволяет располагать переменные и функции в любом порядке... Я что-то не так понял?

Хакер писал(а):И да, в языках того же класса, что и VB (то есть С, С++, Дельфи) тоже нельзя объявить функцию внутри функции.

1.Ну не совсем функцию. Есть же лямбда-функции, например. Насколько я знаю, новый стандарт Си++ их содержит.
В любом случае, в VS2010:
Код: Выделить всё
#include <cstdio>

int main(void)
  {
  auto square = [=](int x) { return x*x; };
  printf("%d %d %d\n", square(1), square(7), square(-3));
  getchar();
  return 0;
  }
2. Си++ позволяет внутрь функции поместить определение структуры/класса, которое может содержать функции :D
Код: Выделить всё
#include <cstdio>

int main(void)
  {
  struct functions
    {
    static int square(int x) { return x*x; }
    };

  printf("%d %d %d\n", functions::square(1), functions::square(7), functions::square(-3));
  getchar();
  return 0;
  }

ger_kar писал(а):А в каких можно? Я почему-то считал что это не одном языке не прокатит. Да и зачем оно нужно такое извращение, объявлять процедуру внутри другой процедуры. Это что объявленная внутри будет локальной процедурой, которую можно вызвать только из родительской процедуры?

Javascript и Питон, например.
Лямбда-функции есть в .NET.

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

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 21:33

Qwertiy писал(а):Ну если бы было можно, то отдельно скомпилированная tlb бы не понадобилась :)

Мне кажется я выложил 3 примера, и TLB фигурирует только в одном...

Остальное — уже пошёл оффтопик.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.След.

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

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

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

    TopList