Суть такая:
обьявлен класс
class ATL_NO_VTABLE CppReport :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CppReport, &CLSID_ppReport>,
public IDispatchImpl<IppReport, &IID_IppReport, &LIBID_RDLGAXLib>
{
public:
...
его методы....
далее обявлен другой класс
class _CppReport ublic CppReport{
public:
STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
Release...
Addref....
Затем идёт класс CppBank (ActiveX) в котором есть внутренняя переменная _CppReport Report и свойство Report:
STDMETHOD(get_Report)(/*[out, retval]*/ IppReport* *pVal){
Report.QueryInterface(IID_IUnknown,(void**)(pVal));}
Если я регистрирую компоненту просто через REGSVR32 - то всё ОК. я могу вызывать
методы Reporta как
Dim a as CreateObject("rdlgax.ppBank.1")
a.Report.<интерфейс класса Report>
Но! если я регистрирую компоненту через Component Services - то все интерфейсы класса CppBank - вызываются без проблем, а обращение к Report - сразу выкидывает
либо "Interface not implemented" либо "Method ~ of object IppBank failed", в зависимости от содержания CppReport::QueryInterface.
В настоящее время эта ф-ция выглядит так:
STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{
//*ppv = (IppReport*) this;
*ppv = 0;
if ( riid == IID_IUnknown )
*ppv = (IppReport*) this;
else
if ( riid == IID_IppReport ){
*ppv = (IppReport*) this;
}
if ( *ppv )
{
AddRef();
return( S_OK );
}
return (E_NOINTERFACE);
};
Как сделать чтобы всё этоо чудо работало и при регистрации через Component Services.
обьявлен класс
class ATL_NO_VTABLE CppReport :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CppReport, &CLSID_ppReport>,
public IDispatchImpl<IppReport, &IID_IppReport, &LIBID_RDLGAXLib>
{
public:
...
его методы....
далее обявлен другой класс
class _CppReport ublic CppReport{
public:
STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
Release...
Addref....
Затем идёт класс CppBank (ActiveX) в котором есть внутренняя переменная _CppReport Report и свойство Report:
STDMETHOD(get_Report)(/*[out, retval]*/ IppReport* *pVal){
Report.QueryInterface(IID_IUnknown,(void**)(pVal));}
Если я регистрирую компоненту просто через REGSVR32 - то всё ОК. я могу вызывать
методы Reporta как
Dim a as CreateObject("rdlgax.ppBank.1")
a.Report.<интерфейс класса Report>
Но! если я регистрирую компоненту через Component Services - то все интерфейсы класса CppBank - вызываются без проблем, а обращение к Report - сразу выкидывает
либо "Interface not implemented" либо "Method ~ of object IppBank failed", в зависимости от содержания CppReport::QueryInterface.
В настоящее время эта ф-ция выглядит так:
STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{
//*ppv = (IppReport*) this;
*ppv = 0;
if ( riid == IID_IUnknown )
*ppv = (IppReport*) this;
else
if ( riid == IID_IppReport ){
*ppv = (IppReport*) this;
}
if ( *ppv )
{
AddRef();
return( S_OK );
}
return (E_NOINTERFACE);
};
Как сделать чтобы всё этоо чудо работало и при регистрации через Component Services.