Как из самой библиотеки запретить включение её в проект?

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

Как из самой библиотеки запретить включение её в проект?

Сообщение arthur2 » 24.04.2009 (Пт) 19:31

Пишу ActiveX.dll, которая должна применяться только во время отладки и не должна быть включена в экзешник. Подключается к проекту поздним связыванием.

Отсюда вопрос: Можно ли изнутри библиотеки воспрепятствовать её включению в референцы проекта? И желательно бы - с сообщением :)

И ещё вопрос: может ли библиотека сама определить, прописана ли она в референцы или создана методом CreateObject?
Артур
 
   

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Как из самой библиотеки запретить включение её в проект?

Сообщение karlex » 24.04.2009 (Пт) 20:27

arthur2 писал(а):может ли библиотека сама определить, ... создана методом CreateObject?

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

arthur2 писал(а):Подключается к проекту поздним связыванием.
Можно ли изнутри библиотеки воспрепятствовать её включению в референцы проекта?

По моему позднее связывание и подключение в референсах это разные вещи.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

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

Re: Как из самой библиотеки запретить включение её в проект?

Сообщение Хакер » 24.04.2009 (Пт) 20:39

И ещё вопрос: может ли библиотека сама определить, прописана ли она в референцы или создана методом CreateObject?

Это массовое заблуждение которое меня сильно бьёт: считают, что есть раннее связывание и позднее связывание — две противоположенные вещи. При этом считают, что раннее связывание это когда «через References», а позднее — «с помощью CreateObject».

Это полная ерунда.

Во-первых, CreateObject не должен противопоставляться Референсам. Его можно с большой натяжкой противопоставить только New'у.

Во-вторых, то, что библиотека подключена в Рефереснах, ещё не означает, что это раннее связывание.

В-третьих, тот факт, что используется CreateObject, ещё не означает, что используется позднее связывание.

В-четвёртых, создание с помощью New и создание с помощью CreateObject отличаются только внешним видом: оба способа являются переходниками к CoCreateInstance().

В-пятых, ранним или поздним связыванием может быть только доступ к членам следующего вида: xxxxxx.yyyyyyy. Если xxxxx имеет тип Object (на деле IDispatch*), то это позднее связывание (aka «совсем уж позднее связывание» (aka связывание по имени)). Если xxxxxx имеет тип, объявленный в TLB, то это раннее связывание. Если xxxxxx — форма, то это тоже позднее связывание aka «не совсем жу позднее связывание» (aka связыване по dispid-у)).

Отсюда вопрос: Можно ли изнутри библиотеки воспрепятствовать её включению в референцы проекта? И желательно бы - с сообщением

А как её тогда вообще юзать? :shock:
—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 » 24.04.2009 (Пт) 21:02

Хакер писал(а):Это массовое заблуждение которое меня сильно бьёт: считают, что есть раннее связывание и позднее связывание — две противоположенные вещи. При этом считают, что раннее связывание это когда «через References», а позднее — «с помощью CreateObject».
Я и не противопоставлял! А противопоставление ты увидел, потому что всегда его видишь :) Я знаю, что через CreateObject можно создать объект раннего связывания - если его класс будет объявлен в тбл. И вовсю этим пользуюсь :) И, кстати, просветил в этом вопросе меня именно ты :)

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

Я хочу избежать подключения через референсы, потому что библиотека предназначина только для отладки. В экзешнике она не должна работать, да и не сможет :)

А как её тогда вообще юзать?

Через CreateObject, заключенный в условную компиляцию - чтобы в экзешнике не осталось ни малейшего упоминания о моей библиотеке :)

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

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

Re: Как из самой библиотеки запретить включение её в проект?

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

arthur2 писал(а):через CreateObject можно создать объект раннего связывания

Ну фраза ведь опять-таки бред. Не бывает объектов раннего связывание и объектов позднего связывания.

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

Почему бы не сделать тогда просто экспортируемую функцию?

Я хочу избежать подключения через референсы, потому что библиотека предназначина только для отладки. В экзешнике она не должна работать, да и не сможет :)

Добавление библиотеки возможно только когда ты в IDE. Когда есть готовая программа, нет никаких референсов. Ты хочешь, чтобы библиотеку нельзя было добавить в референсы (а сделать это можно только в IDE), но в то же время, хочешь чтобы с библиотекой работали только из под IDE. Противоречие какое-то.




Через CreateObject, заключенный в условную компиляцию - чтобы в экзешнике не осталось ни малейшего упоминания о моей библиотеке :)

Если условная компиляция, то нафиг CreateObject? Чем New не устраивает?
—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 » 24.04.2009 (Пт) 21:46

Хакер писал(а):через CreateObject можно создать объект раннего связывания

Ну фраза ведь опять-таки бред. Не бывает объектов раннего связывание и объектов позднего связывания.
Суть я понимаю, а чтобы корректно выразиться, знаний не хватает :)

Хакер писал(а):Почему бы не сделать тогда просто экспортируемую функцию?
Я не знаю, что это такое.
Хакер писал(а):Добавление библиотеки возможно только когда ты в IDE. Когда есть готовая программа, нет никаких референсов. Ты хочешь, чтобы библиотеку нельзя было добавить в референсы (а сделать это можно только в IDE),


Я хочу именно этого: чтобы в ИДЕ при попытке подключить библу в референсы сообщалось, что она для этого не предназначена.
но в то же время, хочешь чтобы с библиотекой работали только из под IDE. Противоречие какое-то.
В чем противоречие? CreateObject отлично создает объекты из библиотек, не подключенных к проекту.
Хакер писал(а):Если условная компиляция, то нафиг CreateObject? Чем New не устраивает?
Тогда такой вопрос: если библиотека подключена к проекту, но ни разу не используется, её объявление попадет в экзешник? Или будет так же, как с тлб?
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как из самой библиотеки запретить включение её в проект?

Сообщение iGrok » 24.04.2009 (Пт) 22:17

arthur2 писал(а):Тогда такой вопрос: если библиотека подключена к проекту, но ни разу не используется, её объявление попадет в экзешник? Или будет так же, как с тлб?

Если я ничего не путаю, то тот факт, что библиотека подключена к проекту влияет только на то, сможешь ты видеть её в objectbrowser'е и IntelliSense, или нет. Ну и плюс в опциях проекта есть такая штука, как "Remove information about unused ActiveX...". Я правда не уверен, как оно действует на подключенные библы.
label:
cli
jmp label

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

Re: Как из самой библиотеки запретить включение её в проект?

Сообщение arthur2 » 25.04.2009 (Сб) 18:54

iGrok писал(а):Если я ничего не путаю, то тот факт, что библиотека подключена к проекту влияет только на то, сможешь ты видеть её в objectbrowser'е и IntelliSense, или нет.
Ну ещё становится возможным объявлять объекты тех классов, которые есть в этой библиотеки :) Абстрактно мне представляется, что это просто потому, что к проекту оказывается подключена тлб, которая есть внутри библиотеки. Правильно?

Я провел эксперимент: создал длл, подключил её к проекту, затем скомпилировал проект. Разрегистрировал библиотеку и удалил её. Экзешник по-прежнему запускается. Так что, выходит, если объекты не используются, подключение действительно ни на что не влияет. Вопрос можно считать решенным :)
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как из самой библиотеки запретить включение её в проект?

Сообщение iGrok » 25.04.2009 (Сб) 19:00

arthur2 писал(а):
iGrok писал(а):Если я ничего не путаю, то тот факт, что библиотека подключена к проекту влияет только на то, сможешь ты видеть её в objectbrowser'е и IntelliSense, или нет.
Ну ещё становится возможным объявлять объекты тех классов, которые есть в этой библиотеки :) Абстрактно мне представляется, что это просто потому, что к проекту оказывается подключена тлб, которая есть внутри библиотеки. Правильно?

Если память мне ни с кем не изменяет - правильно.
label:
cli
jmp label


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

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

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

    TopList