Как пробросить COM объект из PB в VB?

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

Как пробросить COM объект из PB в VB?

Сообщение jangle » 02.04.2017 (Вс) 11:26

У меня есть вот такой COM класс на PB

Код: Выделить всё
#Compiler PBWin 10
#Compile DLL "com.dll"
#Com TLib On
#Dim All

Class CBase Guid$("{CE5E9E6B-5222-4A0B-ADB1-5264BCEF1ADF}") As Com
    Instance m_x As WString
    Interface IBase Guid$("{F7F5CE35-A29B-44E1-BD51-926F0213F89C}")
        Inherit IDispatch
        Property Get x() As WString
            Property = m_x
        End Property
        Property Set x(ByVal x As WString)
            m_x = x
        End Property
    End Interface
End Class

Class CInherited Guid$("{D264880A-4EEE-4DBE-A540-55A631EAB691}") As Com
    Interface IInherited Guid$("{3ADD365D-736E-4A58-AB2C-A2F6605B63B0}")
        Inherit CBase, IBase
        Method change()
            me.X = "Hello"
        End Method
    End Interface
End Class


И враппер в виде DLL с экспортом, тут создаю COM объект и передаю его в VB

Код: Выделить всё
#Compile DLL
#Dim All

$CLSID_Inherited = Guid$("{D264880A-4EEE-4DBE-A540-55A631EAB691}")
Interface IInherited Guid$("{3ADD365D-736E-4A58-AB2C-A2F6605B63B0}")
  Inherit IDispatch
  Property Get x() As WString
  Property Set x(ByVal x As WString)
  Method change()
End Interface

Sub TestCom Alias "TestCom" ( obj As IInherited) Export
   Dim  testInit As IDispatch
   Dim  test     As IInherited
   Let testInit = NewCom ClsId $CLSID_Inherited Lib "com.dll"
   Let  obj =  testInit
End Sub


И наконец VB код, я вызываю DLL и пытаюсь вызвать COM объект созданный в DLL.
Получаю ошибку: Ошибка 424, Object required!

Код: Выделить всё
Option Explicit
Declare Sub TestCom Lib "wrapper.dll" (obj As Variant)

Sub main()
Dim obj As Variant
  TestCom (obj)  <-- Ошибка 424, Object required!
  obj.Change
  MsgBox obj.x
End Sub


Собственно как мне получить COM объект который был создан в wrapper.dll ?

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

Re: Как пробросить COM объект из PB в VB?

Сообщение Хакер » 02.04.2017 (Вс) 11:55

jangle, вот ты вроде не вчера начал заниматься нашим общим делом, а вопросы всё продолжаешь задавать, как если бы начал вчера.

С какой стати у тебя со стороны VB аргумент объявлен как ByRef ... As Variant, если со стороны PB-это объектная ссылка (указатель на IUnknown или другой интерфейс, унаседованный от IUnknown).

Это же совершенно, абсолютно разные типы: со одной стороны ты передаёшь указатель на 16-байтную структуру, с другой стороны от тебя ждут указатель на 4-байтный указатель.

Должен и со стороны VB быть ByRef ... As New IInherited, а в VB нужно притащить описание этого интерфейса (подключив соответствующую TLB). Либо можно договориться использовать тип IUnknown или Object ( = IDispatch со стороны PB), раз ты собираешься гонять всё через позднее связывание. Тогда не надо будет притаскивать описание интерфейса IInherited.

Кстати, если у тебя враппер порождает объект по CLSID-у стандартным для ActiveX способом, я не вижу ни одной причины, зачем вообще нужен этот враппер — создавай ты сразу из VB экземпляр класса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как пробросить COM объект из PB в VB?

Сообщение jangle » 02.04.2017 (Вс) 14:15

jangle, вот ты вроде не вчера начал заниматься нашим общим делом, а вопросы всё продолжаешь задавать, как если бы начал вчера.


Последние годы я .NET`ом занимаюсь, VB стал забывать :)

Должен и со стороны VB быть ByRef ... As New IInherited, а в VB нужно притащить описание этого интерфейса (подключив соответствующую TLB). Либо можно договориться использовать тип IUnknown или Object ( = IDispatch со стороны PB), раз ты собираешься гонять всё через позднее связывание. Тогда не надо будет притаскивать описание интерфейса IInherited.


Действительно, я ступил. Вот так работает:
Код: Выделить всё
#Compile DLL
#Dim All

$CLSID_Inherited = Guid$("{D264880A-4EEE-4DBE-A540-55A631EAB691}")
Interface IInherited Guid$("{3ADD365D-736E-4A58-AB2C-A2F6605B63B0}")
  Inherit IDispatch
  Property Get x() As WString
  Property Set x(ByVal x As WString)
  Method change()
End Interface

Sub TestCom Alias "TestCom" (obj As IDispatch) Export
   Dim  testInit As IDispatch
   Let  testInit = NewCom ClsId $CLSID_Inherited Lib "com.dll"
   Let  obj =  testInit
End Sub


Код: Выделить всё
Option Explicit
Declare Sub TestCom Lib "wrapper.dll" (obj As Object)

Sub Main()
Dim obj As Object
  TestCom obj
  obj.Change
  MsgBox obj.x
End Sub


Кстати, если у тебя враппер порождает объект по CLSID-у стандартным для ActiveX способом, я не вижу ни одной причины, зачем вообще нужен этот враппер — создавай ты сразу из VB экземпляр класса


Дело в том, что оказывается конструкция:

Код: Выделить всё
Let  testInit = NewCom ClsId $CLSID_Inherited Lib "com.dll"


позволяет использовать COM объекты без регистрации в реестре! Просто оказываешь путь к файлу и дальше используешь его.
Думаю может использовать это для портабельных программ, которые будут работать без установки

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

Re: Как пробросить COM объект из PB в VB?

Сообщение Хакер » 02.04.2017 (Вс) 14:22

jangle, пре
jangle писал(а):Дело в том, что оказывается конструкция:
Код: Выделить всё
Let  testInit = NewCom ClsId $CLSID_Inherited Lib "com.dll"


позволяет использовать COM объекты без регистрации в реестре! Просто оказываешь путь к файлу и дальше используешь его.
Думаю может использовать это для портабельных программ, которые будут работать без установки

jangle, представь себе, на VB ничуть не более сложно породить ActiveX-объект из библиотеки без регистрации, примеры того, как это сделать здесь выкладывались неоднократно, и в общем-то это сводится к тому, чтобы из DLL вызвать функцию GetClassObject, а у объекта, который вернёт эта функция, вызвать метод CreateInstance. То есть по сути два вызова.

Более того, существует официальное решение от Microsoft, которое позволяет создавать ActiveX-объекты без регистрации штатным методом, вообще не переделывая код приложений под это: для этого надо снабдить программу соответствующим манифестом (как его сделать на MSDN описано), который заставит SxS-систему вмешаться в процесс создания объекта, и функция CoCreateInstance полезел искать информацию о классе не в реестре, а в манифесте.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как пробросить COM объект из PB в VB?

Сообщение jangle » 02.04.2017 (Вс) 14:50

на VB ничуть не более сложно породить ActiveX-объект из библиотеки без регистрации, примеры того, как это сделать здесь выкладывались неоднократно,


Да я видел код от Trick`а у него пример на VB. Не понравилось только что он IDE крашит, когда с ним экспериментируешь. И про манифесты тоже знаю)
У меня наверное чисто спортивный интерес. :) Я хочу не только использовать COM DLL без регистрации, но и "прошить" их внутрь в EXE файла, и использовать, без сохранения во временную папку, прямо из памяти. Чтобы получилось полностью монолитное приложение.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как пробросить COM объект из PB в VB?

Сообщение The trick » 02.04.2017 (Вс) 15:20

jangle писал(а):Да я видел код от Trick`а у него пример на VB. Не понравилось только что он IDE крашит, когда с ним экспериментируешь.

Этот?
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как пробросить COM объект из PB в VB?

Сообщение jangle » 02.04.2017 (Вс) 15:34

Да он

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

Re: Как пробросить COM объект из PB в VB?

Сообщение Хакер » 02.04.2017 (Вс) 18:11

jangle писал(а):Да я видел код от Trick`а у него пример на VB.

Я имел в виду то, что выкладывалось как минимум годами десятью раньше (Antonariy, tyomitch).

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

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как пробросить COM объект из PB в VB?

Сообщение jangle » 02.04.2017 (Вс) 18:16

Нет не могу. Того кода с которым я работал уже нет. Но самое неприятное, на код Trick`а ругается касперский и убивает экзешник. :(
Поэтому его ценность не особо высока.


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

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

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

    TopList