Вызов COM объекта написанного на С++

Программирование на Visual Basic for Applications
_Кирилл_
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.05.2005 (Пн) 13:26

Вызов COM объекта написанного на С++

Сообщение _Кирилл_ » 30.05.2005 (Пн) 13:28

Помогите пожалуйста чайнику в VBA. Есть COM-dll написанная на С++, и в ней объект с несколькими методами. Почему-то вылетает ошибка либо вообще падает Excel при вызове тех методов которые возвращают какой либо объект. Падение происходит при выходе из метода.
IDL:
[
object,
uuid(37B826D5-3E69-40A8-B6F9-C320548A14ED),
dual,
helpstring("INIKAPI Interface"),
pointer_default(unique)
]
interface INIKAPI : IDispatch
{
[id(1)]
HRESULT LoadFile(BSTR bstrFile, [out,retval]long *res);

[id(3)]
HRESULT GetObject([out, retval]IDispatch **ppiObject);

};

VBA:
Sub LoadResults()
Dim Viewer As New NIKAPI
Dim Ret As Long
Dim Path As String
Dim Obj As Object

Path = "C:\1.fld"
Ret = Viewer.LoadFile(Path)
Set Obj = Viewer.GetObject()

End Sub

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.05.2005 (Вт) 15:32

а что за указатель такой **ppiObject :?:
как описан в сишной проге этот объект, может здесь проблема. попробуй сделать тоже самое на VB, если вызов не пройдет, то скорее всего - это проблема самой DLL

_Кирилл_
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.05.2005 (Пн) 13:26

Сообщение _Кирилл_ » 01.06.2005 (Ср) 18:41

Так вызов всё-таки происходит. Можно его даже пройти в debug VC++. Ошибка происходит уже в коде VB. А объект выглядит примерно так.

class ATL_NO_VTABLE CMyObject:
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyObject, &CLSID_CMyObject>,
public IDispatchImpl<IMyObject, &IID_IMyObject, &LIBID_MyDll>
{
};

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 01.06.2005 (Ср) 20:34

В коде ВБ сбой может происходить, например, если обращаться к памяти выделенной локально в функции, она(память) при выходе из функции освобождаеться, а клиент на ВБ пытается использовать эту память. Как вариант :?
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

_Кирилл_
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.05.2005 (Пн) 13:26

Сообщение _Кирилл_ » 03.06.2005 (Пт) 10:25

STDMETHODIMP CNIKAPI::GetObject( IDispatch** ppObj )
{
CMyObject* pObj = new CComObject<CMyObject>;
return pObj->QueryInterface( IID_IDispatch, (void**)ppObj );
}

Да, здесь память выделяется локально в функции, но не освобождается

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 03.06.2005 (Пт) 12:11

А на чем сбой приосходит?
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч


Вернуться в VBA

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

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

    TopList