Как объявить в TLB тип Boolean для VB6

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

Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 03.11.2015 (Вт) 10:54

Как правильно объявить тип Boolean для VB6?
Пробовал так:
HRESULT Property([in] BSTR StrKey, [in, out] VARIANT* StructureMember, [out, retval] VARIANT_BOOL* RetValue);
Компилятор ругается на неизвестный тип. Добавил
typedef short VARIANT_BOOL;
Скомпилировалось нормально, но вот вместо VARIANT_BOOL в библиотеке оказался short, в VB он определился как Integer. Тогда я добавил атрибут публичности
typedef [public] short VARIANT_BOOL;
В TLB он остался как VARIANT_BOOL и в VB6 тоже определяется как VARIANT_BOOL.
А как его объявить, чтобы в VB6 он таки стал нормальным Boolean?
Бороться и искать, найти и перепрятать

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Хакер » 03.11.2015 (Вт) 12:38

Вопрос глупый. Для получения ответа достаточно было скомпилировать ActiveX DLL на VB и посмотреть в составе DLL-файла TLB-шку декомпилятором TLB.

ger_kar писал(а):А как его объявить, чтобы в VB6 он таки стал нормальным Boolean?

Как VARIANT_BOOL и надо.

То, что у тебя ругается как на неопознанный тип, говорит об одном из двух:
Либо ругается на что-то другое или ты неправильно понимаешь суть ошибки. Либо что-то со штатными include-файлами, где объявлены базовые типы.
—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: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 03.11.2015 (Вт) 12:48

Хакер писал(а):Вопрос глупый. Для получения ответа достаточно было скомпилировать ActiveX DLL на VB и посмотреть в составе DLL-файла TLB-шку декомпилятором TLB.
Ну так и сделал. И узрел, что это VARIANT_BOOL и начал с ним мудрить, да не вышло нешиша.
Хакер писал(а):То, что у тебя ругается как на неопознанный тип, говорит об одном из двух:Либо ругается на что-то другое
Нет ругается именно на это, но я попробовал его объявить тупо Boolean и вроде получилось. И TLB'шка скомпилировалась и VB отображает это тип как Boolean. А если декомпилировать, то на этом месте будет опять же VARIANT_BOOL. Вот такие метаморфозы :).
Хакер писал(а):Либо что-то со штатными include-файлами, где объявлены базовые типы.
Так нет же их. Поэтому я собственно и хотел это сделать через typedef, да не тут то было.
Бороться и искать, найти и перепрятать

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Хакер » 03.11.2015 (Вт) 12:51

ger_kar писал(а):Так нет же их.

А обязаны быть.

oaidl.idl
objidl.idl
unknwn.idl
wtypes.idl

У тебя, значит, битая установка студии.
—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: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 03.11.2015 (Вт) 13:04

Хорошо хоть Boolean подошел. Это решило проблему.
Бороться и искать, найти и перепрятать

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Хакер » 03.11.2015 (Вт) 16:09

Это не решило проблему. Чини своё инсталляцию.
—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: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 05.11.2015 (Чт) 22:49

Это решило проблему, но как оказалось частично. Если компиляцию TLB производить mktyplib.exe, то все вполне себе нормально компилируется. mktyplib.exe вполне себе понимает тип Boolean и все делает нормально, а вот подлый midl.exe на Boolean ругается. Все ничего и можно было бы обойтись и без мидла и использовать вместо него mktyplib, но с ним (mktyplib) другая трабла. Он ни в какую не хочет воспринимать атрибут optional для аргумента. И вопрос собственно в том, как для mktyplib объявить опциональный аргумент?
midl не хочу использовать еще и потому, что он добавляет в библиотеку всякую левую фигню, которую я не объявлял и которую не добавляет mktyplib. Мутный он какой то этот midl.
Бороться и искать, найти и перепрятать

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Хакер » 06.11.2015 (Пт) 7:30

Проблема — это то, что у тебя битая среда работы. Её надо чинить. А не то, что там какой-то тип не распознаётся (это мелочь).

Пример «левой фигни», которую пихает мидл? Ты просто не умеешь его готовить, скорее всего.
—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: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 06.11.2015 (Пт) 7:47

Хакер писал(а):Проблема — это то, что у тебя битая среда работы. Её надо чинить.
Так уже починил.
Хакер писал(а):Пример «левой фигни», которую пихает мидл?
Так вот же она:
Код: Выделить всё
[
  uuid(A37099CE-E1AA-42FF-B102-53BE3346C000),
  version(0.1),
  helpstring("DynamicStructure Description of the interfaces"),
  custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 83951780),
  custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1446784630)

]

Насовал каких то левых custom'омов. Так что mktyplib пока вне конкуренции, я думаю, что просто такое объявление как у MIDL - > HRESULT Sort([in, optional] long Flags) нужно поменять, на такое, которое понятно mktyplib. Но проблема в том, что я не знаю как. Для мидла код получается де компиляцией, а вот как бы посмотреть синтаксис для mktyplib.
Бороться и искать, найти и перепрятать

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Sam777e » 06.11.2015 (Пт) 8:31

Google : синтаксис для mktyplib

Type library — Википедия
https://ru.wikipedia.org/wiki/Type_library
Раньше для этих целей использовался mktyplib.exe, который в данное время считается ... Синтаксис входных файлов отличается от оного у MIDL'а.

...

MkTypLib (конс.)
Устаревший и не рекомендованный к использованию компилятор для создания TLB-файлов. Синтаксис входных файлов отличается от оного у MIDL’а. При необходимости компиляции исходников, написанных в «старом стиле», рекомендуется использовать MIDL с ключом /mktyplib203[11].
...
9 ↑ Differences Between MIDL and MkTypLib (MSDN).
...
11 ↑ Описание ключа /mktyplib203 (англ., MSDN).
Здоровья и удачи

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 08.11.2015 (Вс) 9:52

Спасибо, почитал информацию, а также дополнительно нашел непосредственно про синтаксис ODL(mktyplib) и описание атрибутов.
А также синтаксис описание модулей и обявления с директивами.
Кое что конечно прояснилось. Оказалось что различий то гораздо больше, чем описано в Differences Between MIDL and MkTypLib (MSDN). Например в систаксисе MIDL можно сделать опциональным любой аргумент(любого типа), а в ODL(MkTypLib) только для типа Variant. Кроме этого возникла проблема с объявлением массива. В MIDL можно объявляется так: [in] SAFEARRAY(void) *ppSA, а MkTypLib такое объявление не понимает.
Бороться и искать, найти и перепрятать

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Vi » 09.11.2015 (Пн) 11:56

ger_kar писал(а):Кроме этого возникла проблема с объявлением массива. В MIDL можно объявляется так: [in] SAFEARRAY(void) *ppSA, а MkTypLib такое объявление не понимает.

А для чего такое абсурдное описание и как ты себе представляешь массив void'ов? Я понимаю, что для описания массива есть константа VT_VOID=24, позволяющая правильно описать такой массив в терминах TLB, но использовать его никто не сможет.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 09.11.2015 (Пн) 12:18

Vi писал(а):А для чего такое абсурдное описание и как ты себе представляешь массив void'ов?
Если объявлять массив void'ов, то это будет выглядеть так [in] SAFEARRAY(void*)* ppSA и MkTypLib как раз такое описание вполне понимает, а [in] SAFEARRAY(void) *ppSA это не массив void'ов, а массив любого типа. И если объявить массив void'ов, то он по сути бесполезен ибо VB такое не поддерживает, а вот массив любого типа это то, что в VB довольно часто применяется. Например нужно получить указатель на переменную, если переменная простая (не массив), то VarPtr и все готово, но если попробовать передать туда переменную массива, то будет жестокий облом, а вот если пере объявить туже самую функцию но используя [in] SAFEARRAY(void) *ppSA , то туда можно будет передать массив и получить адрес этой переменной, а можно пере объявить в TLB знакомую всем GetMem4 (спасибо Хакеру, это его идея) так:
[entry("GetMem4")] HRESULT _stdcall ArrPtr([in] SAFEARRAY(void)* Array, [out, retval]long* rv);
И можно сразу получить указатель на SafeArray.
Vi писал(а):Я понимаю, что для описания массива есть константа VT_VOID=24, позволяющая правильно описать такой массив в терминах TLB
Так это если массив содержится в переменной типа Variant, а в моем случае это обычная переменная - указатель на SafeArray.
Бороться и искать, найти и перепрятать

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Хакер » 09.11.2015 (Пн) 15:25

Vi писал(а):А для чего такое абсурдное описание и как ты себе представляешь массив void'ов?

Нетипизированные указатели void* со стороны VB видятся как As Any, позволяя передавать что угодно и выбирать между ByRef и ByVal при каждом вызове.

VB допускает As Any только для Declare Sub/Declare Function, либо для внешних функций, импортируемых через TLB.
Кроме просто Математическая формула: arg As Any VB также поддерживает arg() As Any, позволяя передавать ссылку на массив любого типа (массив с любым типом элементов).

На языке IDL запись SAFEARRAY(void)* arr как раз и соответсвтует VB-шному arr() As Any. Так что описание не абсурдное, это такая фишка.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Vi » 10.11.2015 (Вт) 9:25

Хакер писал(а):На языке IDL запись SAFEARRAY(void)* arr как раз и соответсвтует VB-шному arr() As Any. Так что описание не абсурдное, это такая фишка.

А-а-а, это вы просто для VB6 делаете, тогда вопросов нет. Я-то думал, что СОМ интерфейс с таким определением...
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Как объявить в TLB тип Boolean для VB6

Сообщение ger_kar » 10.11.2015 (Вт) 16:48

Vi писал(а):А-а-а, это вы просто для VB6 делаете
Да уж. Недаром говорят, что-бы что то хорошо спрятать - нужно положить это на самом видном месте. А самое видное (причем в каждом посте) это название темы :)
Бороться и искать, найти и перепрятать

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Как объявить в TLB тип Boolean для VB6

Сообщение Vi » 11.11.2015 (Ср) 13:42

ger_kar писал(а):
Vi писал(а):А-а-а, это вы просто для VB6 делаете
Да уж. Недаром говорят, что-бы что то хорошо спрятать - нужно положить это на самом видном месте. А самое видное (причем в каждом посте) это название темы :)

Я бы не сказал, что прятки. Я понял так, чтобы в открытой ТЛБ ВБ6 показывал булевский тип как его встроенный тип Boolean, а не как-то по-другому. Но где у тебя сказано, что эту ТЛВ будет читать только ВБ6 (тем более, что раздел не про него, а вообще про платформу СОМ) и что это должно быть в весьма специфичном разделе ТЛБ как [module], которую, например, мой компилятор С++ просто не импортирует в свои хидеры и, значит, её вообще не существует для него?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в OLE / COM / ActiveX

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

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

    TopList