Как вызвать объект из ocx?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Как вызвать объект из ocx?

Сообщение 0xy » 14.07.2012 (Сб) 21:43

ocx лежит в папке проги, добавлен в референсы проекта VB6 и вроде зарегистрирован (ключ в реестре присутствует со значением 1).
Объекты из ocx видны в проводнике объектов, однако при обращении к ним (ObjectName.MethodName) возникает Error 424.
В чем грабли?
PS
Не исключено, что и сам OCX кривой...

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

Re: Как вызвать объект из ocx?

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

Непонимание основ detected.
OCX — это COM-сервер. Внутрипроцессный (inproc) COM-сервер. COM-сервер оказывает кому-угодно услугу по порождению COM-объектов. Объекты не живут в сервере, они создаются по мере необходимости по запросу COM-клиентов. Зато в COM-сервере живут фабрики классов для предоставляемых COM-сервером классов.
Контроллы — это тоже COM-классы. И у них есть свои соответствующие фабрики.

А теперь пожалуйста ещё раз вопрос, но без ереси.

В частности:
0xy писал(а):Объекты из ocx видны в проводнике объектов

Объекты из ocx не могут быть видны в object browser-е. Там видны классы user-контролов, модули, энумы.

0xy писал(а):однако при обращении к ним (ObjectName.MethodName) возникает Error 424.

Нет такого понятия, как обращение к объектам. Нет никакого Object Name. На месте ObjectName в твоём сообщении должно стоять VariableName. Вот тогда будет всё правильно.

0xy писал(а):В чем грабли?

В том что ты что-то делаешь, но не правильно понимаешь суть делаемого.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 15.07.2012 (Вс) 0:45

Ну, тогда так:
Объекты Классы из ocx видны в проводнике объектов.

Нет никакого Object Name. На месте ObjectName в твоём сообщении должно стоять VariableName. Вот тогда будет всё правильно.

Да, именно так я и пытаюсь сделать. Но не удается осилить задачу: как создать объекную переменую-указатель на клас из ocx? (видимо, опять элементарное незнание синтаксиса :oops: )

Пишу:
Dim Class As ClassName -- Error 91
Dim Class As New ClassName или Set Class=New ClassName -- Invalid use of New keyword! :evil:

ЗЫ
А там таки юзерконтрол. Может его нужно вызывать через me.controls.add? Но где взять ProgID? Мне известно только имя класса.
Да и сам контрол мне не нужен. Нужны только его функции.

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

Re: Как вызвать объект из ocx?

Сообщение Хакер » 15.07.2012 (Вс) 1:50

0xy писал(а):Но не удается осилить задачу: как создать объекную переменую-указатель на клас из ocx?

Не бывает такого явления, как переменные-указатели на класс. Бывает только такое явление, как указатель на определённый интерфейс объекта. Сам по себе объект очень часто оказывается экземпляром какого-то класса.

0xy писал(а):Dim Class As ClassName -- Error 91

Нельзя называть переменную Class. Это в высшей степени быссмысленно. И таки Error 91 говорит о том, что подобным образом объявленная переменная не содержит никакой ссылки. Что вполне справедливо. Переменная типа Long изначально содержит значение 0. Переменная типа Boolean изначально содержит значение False. Очевидно, что переменная-ссылка изначально содержить Nothing (нулевую ссылку, то есть ни ссылается ни на что). Так что всё логично. Ты просто не отдаёшь отчёт своим действиям.

0xy писал(а):Dim Class As New ClassName или Set Class=New ClassName -- Invalid use of New keyword! :evil:

Нет ничего общего между Dim u as New ClassName и Dim u As ClassName = NewClassName (если бы второй вариант в языке был).

0xy писал(а):А там таки юзерконтрол.

Ну, логично, это же OCX.

0xy писал(а):Может его нужно вызывать через me.controls.add?

Вызывают процедуры и проституток. А контроллы — создают и помещают в соответствующий контейнер. Ты вообще не описал своей задачи. Может быть из миллиона вариантов того, что именно тебе необходимо, правильным вариантом является тот, который говорит, что тебе необходимо всего лишь создать внутри экземпляра какой-то формы экземпляр какого-то контрола? Вполне возможно, но остаётся ещё 999 999 вариантов, ведь ты не сказал, что именно вообще тебе нужно.

0xy писал(а):Но где взять ProgID?

Ну ProgId обычно состоит из имени библиотеки, точки и имени класса. В крайнем случае ProgId можно подсмотреть в реестре, ведь контрол регистрируется там.

0xy писал(а):Да и сам контрол мне не нужен. Нужны только его функции.

Это бессмыслица.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 15.07.2012 (Вс) 3:49

Я просто не достаточно полно, а местами и вовсе неверно описываю свои действия :)
К примеру, причина Error 91 мне была понятна.

Примеры вызова Dim Class As New Class1 я откопал здесь Странно, почему у них на New не ругается.

Может быть из миллиона вариантов того, что именно тебе необходимо, правильным вариантом является тот, который говорит, что тебе необходимо всего лишь создать внутри экземпляра какой-то формы экземпляр какого-то контрола?

Да, разобрался уже. Как всегда, тебе спасибо за граматное описание матчасти :)

Теперь вопрос: всегда ли exe найдет ocx в своей папке? (пока вроде находит).

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

Re: Как вызвать объект из ocx?

Сообщение Хакер » 15.07.2012 (Вс) 5:54

0xy писал(а):Примеры вызова Dim Class As New Class1 я откопал здесь

Вызывают... см. выше кого.

0xy писал(а):Теперь вопрос: всегда ли exe найдет ocx в своей папке? (пока вроде находит).

Регистрация COM-серверов создана для того, чтобы имея информацию о классе (CLSID или ProgId) порождать его экземпляры не обладая сведениями о том, где находится dll-файл, являющийся реализацией COM-сервера. Так что EXE будет брать OCX там, где OCX зарегистрирован, где бы он при этом не лежал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 15.07.2012 (Вс) 14:51

EXE будет брать OCX там, где OCX зарегистрирован, где бы он при этом не лежал.

Любопытно, но на практике наблюдается несколько иная картина :twisted:
ocx, exe и проект exe лежат в одной папке (и больше нигде). И после переименования этой папки, проект (точнее, VB IDE) действительно не находит ocx. А вот при запуске exe, ocx успешно находится и регистрируется :shock: (после чего его находит уже и проект). Не знаешь, что это за шаманство?

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

Сообщение Qwertiy » 15.07.2012 (Вс) 21:32

Говорю наугад. Windows отслеживает перемещения файлов. Например, если создать ярлык на exe'шник, а потом сам exe'шник переместить в другую папку, ярлык будет продолжать работать. Из той же оперы не может быть?

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

Re: Как вызвать объект из ocx?

Сообщение iGrok » 16.07.2012 (Пн) 10:35

Если мне не изменяет память, exe просто пытается его зарегистрировать при запуске. Иногда (справедливости ради, довольно часто) у него это получается.
Но бывает, что и нет. Например, если нет админских прав при запуске (что на сегодня уже, слава роботам, далеко не редкость).
label:
cli
jmp label

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 16.07.2012 (Пн) 14:48

Да, вроде дело обстоит именно так.
Тогда вопросы:
1) какие функции (WinAPI?) производят/ануулируют регистрацию ocx?
2) можно ли заставить ocx работать без регистрации (типа загрузить его LoadLibrary а затем как-то пошаманить?) :)

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

Re: Как вызвать объект из ocx?

Сообщение iGrok » 16.07.2012 (Пн) 16:16

Если мне снова не изменяет память (а она может), этим занимается DllRegisterServer, экспортируемая самой dll (в данном случае, самой ocx).
label:
cli
jmp label

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 17.07.2012 (Вт) 23:28

Еще вопрос: можно ли в параметрах экспортных процедур ocx использовать юзертайпы? И если да, то нужно ли (повторно) описывать эти типы в файле (exe), вызывающем эту процедуру?

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

Re: Как вызвать объект из ocx?

Сообщение Хакер » 17.07.2012 (Вт) 23:33

0xy писал(а):Еще вопрос: можно ли в параметрах экспортных процедур ocx использовать юзертайпы?

Можно.

0xy писал(а):И если да, то нужно ли (повторно) описывать эти типы в файле (exe), вызывающем эту процедуру?

Нет, VB берёт описание из TLB, хранящейся внутри OCX (в ресурсах у OCX).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 17.07.2012 (Вт) 23:41

А будет ли такой ocx совместим с VBA (Access 97)?

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

Re: Как вызвать объект из ocx?

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

Будет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как вызвать объект из ocx?

Сообщение 0xy » 24.07.2012 (Вт) 22:09

Похоже, таки не совместим :(
ocx с вот таким контролом, под Assecc 97 падает прямо в конструкторе (при попытке разместить его на форме):
Код: Выделить всё
Public Type UserType1
   A () As String
   B() As Long
End Type

Public Event Event1(C As UserType1)

Если Event1 не объявлять (в ocx), то не упадет.
Или я что-то не так делаю?


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

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

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

    TopList