Здравствуйте, 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".
Добрый день всем!
Собственно, сабж. Есть ДЛЛ или ОСХ, нужно создать объек без регистрации библиотеки.
Рабочий пример как это сделать исключительно на ВБ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>Функция выглядит так:
Неправильно. Лишняя косвенность не нужна, нужно правильно передать нужный интерфейс.