Опять про тлб

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

Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 10:20

Надо бы раздел такой или подраздел где-то устроить, а? А то не понятно, куда постить. Пощу пока здесь, поскольку применять собираюсь в бейсике :)

Что я делаю не так? Компилирую такую idl:
Код: Выделить всё
[
  uuid(22B38A80-C22B-11D0-8253-00805F5552AB),
  version(0.1),
  helpstring("Win32 структуры и константы")
]
library test
{
typedef struct tagRECT  {
               
long Left;
               
long Top;
               
long Right;
               
long Bottom;
    } RECT ;
}

Мидл заявляет мне, что redefinition : tagRECT
Очевидно, потому что в мидле, а точнее в по умолчании подключаемой им wtypes.idl рект уже объявлен. Ну ладно, делаю так:
Код: Выделить всё
[
  uuid(22B38A80-C22B-11D0-8253-00805F5552AB),
  version(0.1),
  helpstring("Win32 структуры и константы")
]
library test
{
typedef struct tagT  {
               
RECT r;
    } T ;
}

Теперь всё компилируется. Подключаю к проекту, смотрю - в тлб задекларированы tagRECT и tagT. Вопрос - почему tagRECT, а не просто RECT? И нельзя ли как-то задекларировать тот же рект без вспомогательного Т?
Артур
 
   

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

Re: Опять про тлб

Сообщение Хакер » 02.04.2014 (Ср) 10:23

uuid-ы давай UDT-шкам.

arthur2 писал(а):Надо бы раздел такой или подраздел где-то устроить, а? А то не понятно, куда постить. Пощу пока здесь, поскольку применять собираюсь в бейсике

А раздел есть: viewforum.php?f=92
—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: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 10:33

Хакер писал(а):uuid-ы давай UDT-шкам.
Не понял :oops:
Артур
 
   

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

Re: Опять про тлб

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

arthur2 писал(а):Не понял :oops:

Пример:
Код: Выделить всё
[uuid(8A6A2235-AFA1-498e-A99B-3E9040ED9BF9)]
typedef struct __SECURITY_ATTRIBUTES
{
  DWORD  nLength;
  DWORD  lpSecurityDescriptor;
  BOOL   bInheritHandle;
} SECURITY_ATTRIBUTES;
—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: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 10:55

Я так понял, что если указать ректу правильный uuid, он нормально объявится с нормальным именем?
Что такое UDT и где его взять?
Артур
 
   

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

Re: Опять про тлб

Сообщение Хакер » 02.04.2014 (Ср) 11:00

arthur2 писал(а):Я так понял, что если указать ректу правильный uuid, он нормально объявится с нормальным именем?

Не правильный, а вообще любой.
Наверное появится нормально при этом.
Но лучше указывать не любой, а правильный (если он существует).

arthur2 писал(а):Что такое UDT и где его взять?

Ты действительно не знаешь, что такое UDT? Посмотри на свой вопрос со стороны.
—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: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 11:09

А, понял, в смысле структура или по-бейсиковски тип. У меня просто сработало uuid рядом с UDT, что это тоже какой-то идентификатор.

Код: Выделить всё
[
  uuid(22B38A80-C22B-11D0-8253-00805F5552AB),
  version(0.1),
  helpstring("Win32 структуры и константы")
]
library test
{
[uuid(8A6A2235-AFA1-498e-A99B-3E9880E09BF9)]
typedef struct tagT  {
               
long r;
    } T ;
}

Не компилируется. Говорит error generating type library, ignored :
Could not set UUID : tagT
Артур
 
   

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

Re: Опять про тлб

Сообщение Хакер » 02.04.2014 (Ср) 11:25

Чем компилируешь?
Попробуй struct объявлять отдельно, а typedef отдельно, и uuid присваивать именно последнему.
—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: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 11:32

Нет, на самом деле, компилируется - говорит warning MIDL2368 : error ляляля :)
В полученной тлб оказывается почему-то сразу два одинаковых типа - Т и tagT

Сделал то же самое с ректом, изменив tag на tg:
Код: Выделить всё
[
  uuid(22B38A80-C22B-11D0-8253-00805F5552AB),
  version(0.1),
  helpstring("Win32 структуры и константы")
]
library test
{
[uuid(8A6A2235-AFA1-498e-A99B-3E9880E09BF9)]
typedef struct tgRECT {
               
long Left;
               
long Top;
               
long Right;
               
long Bottom;
    } RECT;
}

Скомпилировалось с тем же предупреждением. В тлб сразу два типа - и tgRECT и RECT
Артур
 
   

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

Re: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 11:41

Компилирую мидлом.

Хакер писал(а):Попробуй struct объявлять отдельно, а typedef отдельно
Поскольку мидл говорит, что рект у него уже есть, сделал так:

Код: Выделить всё
{
[uuid(8A6A2235-AFA1-498e-A99B-3E9880E09BF9)]
typedef   RECT  REСT;
}

Компилируется с тем же предупреждением. В тлб теперь ДВА типа - REСT и tagREСT
Артур
 
   

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

Re: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 11:53

Скомпилировал последний вариант MKTYPLIB -ом - получил, что хотел :)

Как же всё всё-таки мутно :drunken:

Попробовал MKTYPLIB -ом без uuid - снова получил что хотел.

А MIDL - какой-то неадекватный...
Артур
 
   

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

Re: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 13:26

В общем, и от мидла я добился чего хотел:
Код: Выделить всё
[
  uuid(22B38A80-C22B-11D0-8253-00805F5552AB),
  version(0.1),
  helpstring("Win32 структуры и константы")
]
library test
{
typedef struct {
               
long Left;
               
long Top;
               
long Right;
               
long Bottom;
    } RECT ;

typedef struct {
RECT R;
}R;
}
Только object browser мне показывает такую хрень:

Clipboard02.jpg
Clipboard02.jpg (28.12 Кб) Просмотров: 8525


А при клике на ссылку получаю: Cannot jump to '__MIDL___MIDL_itf_test_0000_0002' because it is hidden
Что за __MIDL___MIDL_itf_test_0000_0002 такой и откуда взялся?
Причем, опять же, MKTYPLIB то же самое компилирует адекватно.
Последний раз редактировалось arthur2 02.04.2014 (Ср) 18:59, всего редактировалось 1 раз.
Артур
 
   

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

Re: Опять про тлб

Сообщение Vi » 02.04.2014 (Ср) 16:18

Потому что это два разных типа. Один определяется через struct, называется UDT и имеет тип TKIND_RECORD. Второй определяется через typedef, называется псевдоним и имеет тип TKIND_ALIAS.
Как правило, пишут typedef struct RECT { ... } RECT. Тогда struct RECT перекрывается последним RECT. Если это перекрытие не сделать, то всегда будут ДВА имени, даже если не указать для struct никакого имени, потому что компилятор добавит его от себя.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 17:43

Vi писал(а):Как правило, пишут typedef struct RECT { ... } RECT. Тогда struct RECT перекрывается последним RECT. Если это перекрытие не сделать, то всегда будут ДВА имени, даже если не указать для struct никакого имени
Изначально код взят из oleViewer-a, и удручает сам факт того, что декомпилированное назад не компилируется.

До двойного ректа я тоже додумался. Но остановился на том, чтобы оставить один псевдоним - и мидл и mktypelib - оба, тем не менее, поняли меня правильно. (Хотя мидл накомпилировал-таки с каким-то косяком - см. картинку :)

В первом варианте - взятом прямиком из декомилированой тлб - получилось, опять же, не два типа, а только тот, который у структуры - псевдоним проигнорировался. И только если указать uuidl, получилось так, как ты описал. (это в структурах, описанных аналогично ректу - сам рект вообще в первом варианте компилироваться отказался)
Артур
 
   

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

Сообщение Qwertiy » 02.04.2014 (Ср) 17:54

arthur2 писал(а):см. картинку

Нету картинки...

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

Re: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 19:00

хм... странно - у меня картинку видно. Перезалил ещё раз
Артур
 
   

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

Re: Опять про тлб

Сообщение arthur2 » 02.04.2014 (Ср) 21:45

Ну вот - скомпилировал тлб, подключил к проекту - все структуры и константы видит, они нормально работают в коде. Так что тлб, вроде, не кривая... Теперь пробую посмотреть эту тлб через олевьюер - и тот вываливается с ошибкой "память не могёт быть рид"

Все инструменты какие-то кривовастенькие :(
Артур
 
   

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

Re: Опять про тлб

Сообщение Vi » 03.04.2014 (Чт) 10:35

arthur2 писал(а):До двойного ректа я тоже додумался. Но остановился на том, чтобы оставить один псевдоним - и мидл и mktypelib - оба, тем не менее, поняли меня правильно. (Хотя мидл накомпилировал-таки с каким-то косяком - см. картинку :)

В первом варианте - взятом прямиком из декомилированой тлб - получилось, опять же, не два типа, а только тот, который у структуры - псевдоним проигнорировался. И только если указать uuidl, получилось так, как ты описал. (это в структурах, описанных аналогично ректу - сам рект вообще в первом варианте компилироваться отказался)

Object Browser (F2) имеет режим Show hidden members, который изначально не включен (правая кнопка мыши на поле Object Browser). У меня твоё описание "typedef struct { long Left, Top, Right, Bottom; } RECT ; typedef struct { RECT R; } R;" даёт все 4 типа.
Вложения
Object Browser.jpg
Object Browser.jpg (24.43 Кб) Просмотров: 8504
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Опять про тлб

Сообщение Хакер » 03.04.2014 (Чт) 11:00

Как-то я пропустил email-уведомление и, таким образом, пропустил развитие темы.

Открыл случайный старый проект с TLB.

UDT объявляется так:
Код: Выделить всё
   typedef struct OPENFILENAME
   {
      DWORD         lStructSize;
      HWND          hwndOwner;
      HINSTANCE     hInstance;
      DWORD         lpstrFilter;
      DWORD         lpstrCustomFilter;
      DWORD         nMaxCustFilter;
      DWORD         nFilterIndex;
      DWORD         lpstrFile;
      DWORD         nMaxFile;
      DWORD        lpstrFileTitle;
      DWORD         nMaxFileTitle;
      DWORD         lpstrInitialDir;
      DWORD         lpstrTitle;
      OPENFILEFLAGS Flags;
      WORD          nFileOffset;
      WORD          nFileExtension;
      DWORD         lpstrDefExt;
      DWORD         lCustData;
      DWORD        lpfnHook;
      DWORD         lpTemplateName;
      DWORD         pvReserved;
      DWORD         dwReserved;
      DWORD         FlagsEx;
   } OPENFILENAME;


Компилируется так:
Код: Выделить всё
midl apidecl.odl /win32 /tlb ..\..\..\tlb\apidecl.tlb
pause


Вывод ошибок не сожержит:
Код: Выделить всё
G:\dev\z14_matew\src\tlb\apidecl>midl apidecl.odl /win32 /tlb ..\..\..\tlb\apide
cl.tlb
Microsoft (R) MIDL Compiler Version 5.01.0164
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
Processing .\apidecl.odl
apidecl.odl
Processing C:\soft\devtools\vs6\vc6\include\oaidl.idl
oaidl.idl
Processing C:\soft\devtools\vs6\vc6\include\objidl.idl
objidl.idl
Processing C:\soft\devtools\vs6\vc6\include\unknwn.idl
unknwn.idl
Processing C:\soft\devtools\vs6\vc6\include\wtypes.idl
wtypes.idl

G:\dev\z14_matew\src\tlb\apidecl>pause
Для продолжения нажмите любую клавишу . . .


В Object Browser-е никакого мусора нет, даже при включении «Show hidden members»:
vb_tlb_obj_browser_no_messy_typeinfos.png
vb_tlb_obj_browser_no_messy_typeinfos.png (17.68 Кб) Просмотров: 8500

Что я делаю не так? Что ты делаешь не так? Версия MIDLа?
—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: Опять про тлб

Сообщение arthur2 » 03.04.2014 (Чт) 21:15

Vi Про хидены понял, спасибо :)

Ты будешь смеяться, но mktyplib в отличии от мидла скомпилировал-таки адекватно и структуры с одними псевдонимами, и структуры, где имена отличались от псевдонимов. И без лишних скрытых типов. То есть, сделал ровно то, что его просили, без отсебятены.

Впрочем, я же в оконцовке сделал-то как раз как ты говоришь - чтобы имена совпадали с псевдонимами - просто было проще стереть все tag, чем стирать для каждой структуры разные имена. В результате:
Артур писал(а): подключил к проекту - все структуры и константы видит, они нормально работают в коде. Так что тлб, вроде, не кривая... Теперь пробую посмотреть эту тлб через олевьюер - и тот вываливается с ошибкой "память не могёт быть рид"
Причем, что мидлом, что mktyplib-ом - на этот раз одинаково :(

Хакер писал(а): Что я делаю не так? Что ты делаешь не так? Версия MIDLа?
Ну делал-то я, следуя советам, uuid-ы :) Кстати, а зачем они в принципе структурам? Чтобы в вариант можно было пихать? Мидл из шестой студии.
Артур
 
   

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

Re: Опять про тлб

Сообщение Vi » 04.04.2014 (Пт) 10:06

arthur2 писал(а):Ты будешь смеяться, но mktyplib в отличии от мидла скомпилировал-таки адекватно и структуры с одними псевдонимами, и структуры, где имена отличались от псевдонимов. И без лишних скрытых типов. То есть, сделал ровно то, что его просили, без отсебятены.

Различие между MIDL и MkTypLib: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366797%28v=vs.85%29.aspx
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Опять про тлб

Сообщение Хакер » 04.04.2014 (Пт) 13:08

arthur2 писал(а):Кстати, а зачем они в принципе структурам? Чтобы в вариант можно было пихать?

Не только.

Для структур (как и для интерфейсов) не действует утиная типизация. Поэтому одинаковый UUID нужен, чтобы, например, метод из одной ActiveX-библиотеки мог вернуть UDT, а метод из другой — принять этот UDT своим аргументом.
—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: Опять про тлб

Сообщение arthur2 » 09.04.2014 (Ср) 20:34

Vi Спасибо :) Различия я понял, но мой плохой английский не дал мне понять, ЗАЧЕМ МIDL так странно компилирует (хотя, по-моему, ответа на этот вопрос там всё-таки просто нет). Зачем делать то, что не просят? Зачем могут понадобиться эти невидимые дополнительные определения той же структуры? И даже если это всё-таки зачем-то нужно - почему делать так нелогично? Если кому-то нужно - пусть пропишет это в коде, раз в коде нет - зачем городит? Ведь mktyplib же компилирует логично.

Хакер Понятно :) а если UUID у структуры указано, имеет тогда значение, как она названа? тот же рект и тегPект - они будут приняты одинаково другой библиотекой?
Последний раз редактировалось arthur2 09.04.2014 (Ср) 20:57, всего редактировалось 1 раз.
Артур
 
   

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

Re: Опять про тлб

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

arthur2 писал(а):имеет тогда значение, как она названа?

Для VB — имеет.
—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: Опять про тлб

Сообщение Vi » 10.04.2014 (Чт) 11:01

arthur2 писал(а):Различия я понял, но мой плохой английский не дал мне понять, ЗАЧЕМ МIDL так странно компилирует (хотя, по-моему, ответа на этот вопрос там всё-таки просто нет). Зачем делать то, что не просят? Зачем могут понадобиться эти невидимые дополнительные определения той же структуры? И даже если это всё-таки зачем-то нужно - почему делать так нелогично? Если кому-то нужно - пусть пропишет это в коде, раз в коде нет - зачем городит? Ведь mktyplib же компилирует логично.

ИМХО, там всё дело вертится вокруг typedef struct struct_tag { ... } this_struct; Во всех языках это две связанные сущности struct_tag и this_struct. Это не две похожие - до совпадения - друг на друга структуры, а именно что одно и то же. mktyplib же их разделял и создавал TKIND_RECORD для обеих, я уж не знаю почему, может потому, что или не было спецификации TKIND_ALIAS, или эту спецификацию немногие понимали. МIDL как более поздняя программа может компилировать как mktyplib (ключ /mktyplib203), так и по-новому, и плюёт на совместимость или непонимание. Видимо, привели в соответствие.

PS
Если не трудно, дай две TLB для сравнения - одну сделанную mktyplib, а другую - МIDL, чтобы сравнить, чем же они отличаются, как ты говоришь.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Опять про тлб

Сообщение arthur2 » 11.04.2014 (Пт) 16:19

Vi писал(а):Если не трудно, дай две TLB для сравнения

Скомпилировал один и тот же код МИДЛ-ом и mktyplib-ом:
Код: Выделить всё
{

typedef struct tegTEST {
               
long X;
               
    } TEST;
   
typedef struct  {
               
long X2;
               
    } TEST2;
   
typedef struct TEST3 {
               
long X3;
               
    } TEST3;
   
[uuid(4A6A2235-AFA1-498e-A00B-3E9040ED9BF9)]   
typedef struct tegTEST4 {
               
long X4;
               
    } TEST4;

[uuid(5A6A2235-AFA1-498e-A00B-3E9040ED9BF9)]   
typedef struct  {
               
long X5;
               
    } TEST5;

[uuid(6A6A2235-AFA1-498e-A00B-3E9040ED9BF9)]   
typedef struct TEST6 {
               
long X6;
               
    } TEST6;
   
[dllname("lalala.dll")]
       module m
       {

        [entry("m"), helpstring ("проверка декларации структур")]
        void stdcall t (TEST A, TEST2 B, TEST3 C, TEST4 D, TEST5 E, TEST6 F);      
       };
   
   }
MIDL при компиляции выдал предупреждение:
//midl\oleaut32.dll : warning MIDL2368 : error generating type library, ignored :
//Could not set UUID : tegTEST4
//midl\oleaut32.dll : warning MIDL2368 : error generating type library, ignored :
//Could not set UUID : __MIDL___MIDL_itf_testIDL_0000_0002

В мидл-овской тлб структуры TEST нет вообще, а в функции она задекларирована как tegTEST. Тем структурам, которым не были даны имена, мидл дал свои невидимые.

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

odl, на мой взгляд скомпилировался вполне логично.
Вложения
idlodl.zip
(3.04 Кб) Скачиваний: 125
Артур
 
   

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

Re: Опять про тлб

Сообщение ger_kar » 11.04.2014 (Пт) 18:49

Если нужны публичные структуры, либо же свои интерфейсы, которые будут использоваться как публичные, и при этом (не важно по какой причине) проект должен быть StandartExe, то можно не заморачиваясь всякими мидлами сделать такой финт. Нужно просто, то, что требуется в публичном варианте объявить в отдельном ActiveX.Dll проекте и соответственно сделать оные публичными. После чего скомпилировать проект и извлечь готовую Tlb'шку и юзать ее по своему усмотрению. В принципе наверное возможно ее даже в виде ресурса запихнуть в стандартный проект, если решить проблему регистрации. Так как в стандартом проекте не будет в отличии от ActiveX.Dll нужных экспортируемых функций для регистрации.
Бороться и искать, найти и перепрятать

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

Re: Опять про тлб

Сообщение arthur2 » 11.04.2014 (Пт) 19:01

Угу :) Мало того, тлб даже извлекать не придется - в свойствах проекта ставим галочку "Remote Server Files" и среди файлов рядом с проектом находим искомую тлб. Таким способом проще всего делать интерфейсы, энумы и структуры. Но не получается сделать константы и объявления Апи-функций, а так же сущности с конкретными идентификаторами.

Про тлб в ресурсы - не понял... А что мешает просто подключить её в референцы?
Артур
 
   

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

Re: Опять про тлб

Сообщение ger_kar » 11.04.2014 (Пт) 19:18

arthur2 писал(а):Угу Мало того, тлб даже извлекать не придется - в свойствах проекта ставим галочку "Remote Server Files"
Прикольно, я про это не знал :) . Теперь буду юзать.
arthur2 писал(а):Но не получается сделать константы и объявления Апи-функций, а так же сущности с конкретными идентификаторами.
Ну это да, но зато объявлять свои для меня - это самый удобный и безгемморный способ.
arthur2 писал(а):Про тлб в ресурсы - не понял... А что мешает просто подключить её в референцы?
Ну подключить то можно без проблем, но я имел ввиду не это. А то, что можно эту тлбшку не носить отдельно, а вшить прямо в исполняемый файл приложения, просто добавив ее в ресурсы оного. Так же как она вшита в ActiveX.dll и ActiveX.exe. Но проблема в том, что в ActiveX.dll и ActiveX.exe есть экспортируемые функции для регистрации, а в стандартном экзешнике их не будет. Хотя наверное существует способ обойтись и без них.
Бороться и искать, найти и перепрятать

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

Re: Опять про тлб

Сообщение arthur2 » 14.04.2014 (Пн) 5:37

ger_kar писал(а):Теперь буду юзать.
Я этой фишкой пользуюсь, чтобы лучше понять, как именно в идле кодируются те или иные сущность. Например, замутил функцию с опциональным параметром со значением по умолчанию, с массивом параметров, и возвращающую массив структур. Скомпилировал, открыл тлб и посмотрел, как там вся эта акрабатика задекларирована :)
Артур
 
   


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

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

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 54

    TopList