Тема: Как работать с незарегистрированным dll-компонентом?

Имеется dll-комонент типа MyClass, к которому я обращаюсь из макроса VBA. Когда проекту присвоена ссылка на этот компонент (Tools->References-> MyFile.dll)все работает прекрасно. Но дело в том, что это специализированная библиотека, которая никому кроме моей программы не нужна.
И лучше было бы вообще не регистрировать ее в ОС, а обращаться напрямую. Я попытался это сделать, однако не удается создать объект ни функцией CreateObject("MyClass"),
ни функцией GetObject("MyFileName","MyClass").
Ну и вопрос вынесен в заголовок.
Спасибо.
P.S.И если все таки идти путем регистрации компонента, то как программно присвоить проекту ссылку на указанный компонент?

Re: Как работать с незарегистрированным dll-компонентом?

По-моему, если dll-ка использует СОМ-интерфейс, то она должна быть зарегистрирована в системном реестре. Иначе никак. А для регистрации можно использовать хоть Shell и в него передавать regsvr32.exe с именем этой dll-ки и ключом тихого запуска. Наверняка есть иные способы - посмотри, к примеру, на vbstreets.ru.

Re: Как работать с незарегистрированным dll-компонентом?

Скорее не dll-ка, а вызывающая структура использует COM-технологию...
Но не о том речь. Ув. ShaggyDoc где-то утверждал, что не обязательно регистрировать dll-библиотеку чтобы пользоваться ею. Я не нашел эту ветку, но мне нужно не столько утверждение, сколько подсказка - а как это сделать?
А зарегистрировать програмным путем - это не проблема, самый короткий путь подсказывает:
3dcad (2004-09-29 17:10:59)
shell (regsvr32.exe myDll.dll)

Re: Как работать с незарегистрированным dll-компонентом?

> LeonidSN
Посмотри здесь как можно получить список References. Можешь динамически к нему добавить свою dll, а потом ее оттуда удалить.

Re: Как работать с незарегистрированным dll-компонентом?

> Александр Ривилис
Спасибо!
И видел же, а не досмотрел... Кстати, появляется возможность проверить загружен ли компонент поддержки VBA в данном ACAD'е.
Из Help:
This property allows you to access the VBA IDE object model from AutoCAD's object model. The property will throw an exception if the VBAIDE is not available. For example, the VBAIDE is not available if the acadvba.arx app has not been loaded.
И все же остается вопрос об использовании dll без регистрации...

Re: Как работать с незарегистрированным dll-компонентом?

> LeonidSN
Насколько мне известно - если dll-файл - это COM-сервер, то без регистрации его не обойтись. Хотябы потому, что функции CreateObject(), GetObject() и т.д. лезут в реестр и там ищут соответствующий dll/exe-файл. А без регистрации dll эти функции там ничего не найдут...

Re: Как работать с незарегистрированным dll-компонентом?

Если dll - COM-сервер, без регистрации никак нельзя. На момент обращения к объектной модели она должна быть обязательно зарегистрирована.
Регистрацию можно выполнить во время инсталляции или при запуске самого приложения (не как COM-объекта). Запускать regsvr можно, но "не гламурно" - есть же функции API для этого.
Не обязательно импортировать библиотеку типов в свое приложение или среду разработки.
То есть в Windows COM должен быть зарегистрирован, а в среде разработки может и "не числиться".
Импорт TLB нужен только для удобства работы в среде программирования - использование визуальных средств, установка свойств и т.п. Но это надо делать тщательно, так как можно нарваться на то, что в импортированной библиотеке типов ссылки на одни GUID, а в рабочей будут другие.

Re: Как работать с незарегистрированным dll-компонентом?

> Александр Ривилис

> ShaggyDoc
Спасибо за разъяснения, попробуем разобраться и найти оптимальный вариант...
так как можно нарваться на то, что в импортированной библиотеке типов ссылки на одни GUID, а в рабочей будут другие.

Если библиотека сугубо индивидуальная, то такая проблема возможна разве что на машине разработчика, не так ли?

Re: Как работать с незарегистрированным dll-компонентом?

LeonidSN пишет:

Если библиотека сугубо индивидуальная, то такая проблема возможна разве что на машине разработчика, не так ли?

Ну, на своей-то машине разработчик разберется сам, хотя может и забыть о том, что рабочий уже другой вариант. Библиотека типов предоставляется для того, чтобы другие разработчики могли ей воспользоваться. Не желаете раскрывать секреты - делайте обычную dll.

Re: Как работать с незарегистрированным dll-компонентом?

> LeonidSN
После того, как у меня после регистрации DLL программа не захотела однажды правильно работать (обращалась к DLL программы предыдущей версии, расположенной, скажем, в соседней папке. То есть, перерегистрация не получалась) я стал проверять путь к зарегистрированной DLL в реестре. Если это не тот путь который нужен, то DLL по этому пути  сначала разрегистрирую, а потом регистрирую нужную DLL, путь к которой известен. И теперь предыдущих версий у пользователя может быть сколько угодно.
Если DLL скопировать в System32, то, кажется, перерегистрация проходит успешно всегда.

ShaggyDoc пишет:

Запускать regsvr можно, но "не гламурно" — есть же функции API для этого.

Не подскажете, какие?

Re: Как работать с незарегистрированным dll-компонентом?

> brigval
Даже не представляешь себе, насколько вОвремя появился твой пост! Я как раз сидел и обдумывал
такого рода варианты. Так что спасибо за нужные слова в нужный момент.
Что касается "гламурных"(с легкой руки ShaggyDoc) решений по регистрации dll, то был на форуме такой разговор:
https://www.caduser.ru/forum/topic12513.html
но я в этих функциях еще не разбирался и не проверял в работе.

Re: Как работать с незарегистрированным dll-компонентом?

> LeonidSN
:)
Пожалуйста и спасибо за ссылку.