Почему GetObject не работает с моими объектами?

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

Почему GetObject не работает с моими объектами?

Сообщение Antonariy » 21.04.2008 (Пн) 11:35

Потребовалось подключиться к работающему ActiveX EXE, но получил "ActiveX component can't create object", попробовал другие свои ActiveX EXE-проекты - то же самое.
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 21.04.2008 (Пн) 12:21

Внимательно перепроверь версии OLE использованные при компиляции.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.04.2008 (Пн) 14:02

"Версии OLE" это что?
Все библиотеки в единственном экземпляре, CreateObject работает.
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Почему GetObject не работает с моими объектами?

Сообщение Vi » 22.04.2008 (Вт) 8:41

Antonariy писал(а):Потребовалось подключиться к работающему ActiveX EXE, но получил "ActiveX component can't create object", попробовал другие свои ActiveX EXE-проекты - то же самое.
Чтобы иметь доступ к работающему объекту по GetObject(,"ProgID"), нужно, чтобы сервер зарегистрировал свой объект как активный. VB таких средств не предоставляет, но есть С-шные API RegisterActiveObject и RevokeActiveObject из oleaut32.dll.

HRESULT RegisterActiveObject(
IUnknown FAR* punk,
REFCLSID rclsid,
DWORD dwFlags,
unsigned long FAR* pdwRegister
);
HRESULT RevokeActiveObject(
unsigned long dwRegister,
void FAR* pvReserved
);
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.04.2008 (Вт) 9:09

Спасибо за наводку :)
Код: Выделить всё
Private Type GUIDs
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

'Declares needed to register object in the ROT (Run Object Table)
Private Const ACTIVEOBJECT_STRONG = 0
Private Const ACTIVEOBJECT_WEAK = 1
Private Declare Function CLSIDFromProgID Lib "ole32.dll" (ByVal ProgID As Long, rclsid As GUIDs) As Long
Private Declare Function CoDisconnectObject Lib "ole32.dll" (ByVal pUnk As IUnknown, pvReserved As Long) As Long
Private Declare Function RegisterActiveObject Lib "oleaut32.dll" (ByVal pUnk As IUnknown, rclsid As GUIDs, ByVal dwFlags As Long, pdwRegister As Long) As Long
Private Declare Function RevokeActiveObject Lib "oleaut32.dll" (ByVal dwRegister As Long, ByVal pvReserved As Long) As Long
Private OLEInstance As Long

Public Sub AddToROT()
Dim mGuid As GUIDs
Dim lp As Long
    'The magic happens here
    'This code is responsible for creating the entry in the ROT
    'Make sure to insert the correct qualified object (class) that you want in the ROT.
    OLEInstance = 0
    lp = CLSIDFromProgID(StrPtr("YourActiveXServerName.YourClassName"), mGuid)
    If lp = 0 Then lp = RegisterActiveObject(Me, mGuid, ACTIVEOBJECT_WEAK, OLEInstance)
End Sub

Public Sub RemoveFromROT()
    'Once we are done with the main program, lets clean up the rot
    'by removing the entry for our ActiveX Server/DLL
    If OLEInstance <> 0 Then RevokeActiveObject OLEInstance, 0
    CoDisconnectObject Me, 0
End Sub
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Vi » 23.04.2008 (Ср) 6:58

Я бы порекомендовал использовать ACTIVEOBJECT_STRONG вместо ACTIVEOBJECT_WEAK.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


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

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

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

    TopList