Добрый день всем!
Собственно, сабж. Есть ДЛЛ или ОСХ, нужно создать объек без регистрации библиотеки.
Рабочий пример как это сделать исключительно на ВБ6 я нашел на vbstreets, но создать объект хочу на С++ и вернуть его вызывателю в ВБ. Тут начинаются грабли. С++ код отрабатывает, но в ВБ вызов метода возвращенного объекта , в лучшем случае приводит к выходу из процедуры, в худшем — Access Voilation. Повторюсь, что аналогичный код, написаный на ВБ работает.
Кусок ф-ции создания объекта:
Не уверен. Судя по всему, StdOle.IUnknown (в VB6) соответствует IUnknown*. такой вывод я сделал, в частности, исходя из вот таких строк:
Public Function CreateObjectFromFile1(ByVal strLibrary As String, ByVal strClassName As String) As stdole.IUnknown
Dim newobj As stdole.IUnknown
'................Call CallPointer (udtCF.CreateInstance, obj, 0, VarPtr(IID_IUnknown), VarPtr(newobj)) 'VarPtr(newobj) equ IUnknown** ???
'................Set CreateObjectFromFile1 = newobj
End Function
вызыватель делает:
Dim o as object
Set o = CreateObjectFromFile1 ("MyTest.dll", "clsTestClass")
o.TestMetod ("123")
и как-бы работает....
Не страшно, если ты один.
Страшно — если ты ноль.
Re[3]: Создание объекта COM в рантайме БЕЗ регистрации *.dll
Здравствуйте, NewEmptyName, Вы писали:
NEN>Здравствуйте, ZAMUNDA, Вы писали: NEN>Не уверен. Судя по всему, StdOle.IUnknown (в VB6) соответствует IUnknown*. такой вывод я сделал, в частности, исходя из вот таких строк:
И хоть ваш вывод верен, но всётаки я настаиваю
Здравствуйте, NewEmptyName, Вы писали:
NEN>Собственно, сабж. Есть ДЛЛ или ОСХ, нужно создать объек без регистрации библиотеки. NEN>Рабочий пример как это сделать исключительно на ВБ6 я нашел на vbstreets, но создать объект хочу на С++ и вернуть его вызывателю в ВБ. Тут начинаются грабли. С++ код отрабатывает, но в ВБ вызов метода возвращенного объекта , в лучшем случае приводит к выходу из процедуры, в худшем — Access Voilation. Повторюсь, что аналогичный код, написаный на ВБ работает. NEN>... NEN>и не работает
Приведи declare-код на VB, который определяет CreateObjectFromFile.
Здравствуйте, Vi2, Вы писали: Vi2>Приведи declare-код на VB, который определяет CreateObjectFromFile.
Сейчас декларация выглядит так:
Private Declare Function CreateObjectFromFile Lib"D:\WorkFlow\OrderFW\OrderFW\Debug\OrderFW.dll" (ByVal strLibrary As String, ByVal strClassName As String, ByVal ArrayDwordsPtr20 As Long) As Object
Dim nObj As Object
Set nObj = CreateObjectFromFile(s1, s2, VarPtr(a(0)))
nObj.TestMethod("123") 'ашыпка
проверку возвр. значений ф-ций, само собой, делаю, просто не привел чтоб не нагромождать код. указатель на инстанс я получаю... только дальше...
я явно где-то тут элементарно затупил.. надо взгляд со стороны
Не страшно, если ты один.
Страшно — если ты ноль.
Re[3]: Создание объекта COM в рантайме БЕЗ регистрации *.dll
Private Declare Function CreateObjectFromFile1 Lib"D:\WorkFlow\OrderFW\OrderFW\Debug\OrderFW.dll" (ByVal strLibrary As String, ByVal strClassName As String) As stdole.IUnknown
Dim objCtrl As Object
Dim objCtrl1 As stdole.IUnknown
Set objCtrl1 = CreateObjectFromFile1(s1, s2)
Set objCtrl = objCtrl1
objCtrl.TestMethod ("123")'так работает.. :xz:
то что работает — это хорошо, а вот то что я не понял каким образом так получается с Set — соотв. плохо.
хочется сразу вернуть объект. да , собственно не понятно почему просто вот так не работает ?
Dim objCtrl As Object
Set objCtrl = CreateObjectFromFile1(s1, s2)
objCtrl.TestMethod ("123")'не работает
Не страшно, если ты один.
Страшно — если ты ноль.
Re[3]: Создание объекта COM в рантайме БЕЗ регистрации *.dll
Здравствуйте, NewEmptyName, Вы писали:
NEN>Сейчас декларация выглядит так:
Я так и думал.
NEN>Private Declare Function CreateObjectFromFile Lib"D:\WorkFlow\OrderFW\OrderFW\Debug\OrderFW.dll" (ByVal strLibrary As String, ByVal strClassName As String, ByVal ArrayDwordsPtr20 As Long) As Object
Т.е. считается, что функция возвращает IDispatch интерфейс, поэтому VB не проверяет и не запрашивает специально этот интерфейс. А Object и есть IDispatch*.
NEN>Функция выглядит так:
Неправильно. Лишняя косвенность не нужна, нужно правильно передать нужный интерфейс.
Здравствуйте, NewEmptyName, Вы писали:
NEN>И еще вариант , который работает:
NEN>Private Declare Function CreateObjectFromFile1 Lib"D:\WorkFlow\OrderFW\OrderFW\Debug\OrderFW.dll" (ByVal strLibrary As String, ByVal strClassName As String) As stdole.IUnknown
NEN> Dim objCtrl As Object
NEN> Set objCtrl = CreateObjectFromFile1(s1, s2)
NEN> objCtrl.TestMethod ("123")'не работает
Это должно работать, т.к. VB запросит нужный интерфейс, потому что stdole.IUnknown и Object не одинаковы, и их нужно привести через QueryInterface, что VB и сделает. Простое указание Declare ... As Object не пройдет, т.к. реально передается IUnknown интерфейс, в виртуальной таблице которого нет необходимых функций, нужных для реализации вызова "TestMethod".