Your _event_ interface cannot be dual. It must either derive from
OS).
DLL from the source files generated by MIDL. The ATL appwizard
and later, VC6 uses a different approach).
I found the following information on msdn...
Use MIDL to generate a type library that the system uses to provide
marshaling support at run time. This is the easiest way to implement
marshaling support. All you have to do is generate a type library and
register it by calling RegTypeLib. Your interfaces must be
Automation-compatible (either oleautomation or dual), which places some
restrictions on the kinds of data types you can use as method parameters.
However, in most cases, the advantage of having your interfaces accessible
to
programs written in other languages, such as Microsoft Visual Basic and
Java,
outweighs the limitations on data types.
Since my interface is dual, it seems i will have to generate a type
library
and register it using RegTypeLib. Does anyone know how to do this?
"Alexander Nickolov" wrote:
My first guess would be you failed to build and register your
proxy/stub DLL. Your HRESULT code is 0x80040202, e.g.
CONNECT_E_CANNOTCONNECT. This means the sink does not
implement the necessary interface. Since your sink does that
as evidenced by your QI implementation, the logical culprit is
missing marshaling support.
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"Rohit Kumar" <RohitKumar@discussions.microsoft.com> wrote in message
news:66382A9C-900C-414D-BB3E-0A7DDA829FEF@microsoft.com...
I have created an ATL service which supports connection points. I have
created a method in my interface called DoTest() and also defined a
callback
interface ItestEvents.
In the client side i am implementing the interface. Following is my
client
code.
----------------------------------------------------------------------------------
DWORD dwAdvise;
CComPtr<Itest> pAdd;
hr =pAdd.CoCreateInstance(CLSID_test);
IConnectionPointContainer * pCPC;
IConnectionPoint * pCP;
hr = pAdd->QueryInterface(IID_IConnectionPointContainer,(void
**)&pCPC);
hr = pCPC->FindConnectionPoint(IID_ItestEvents,&pCP);
pCPC->Release();
IUnknown *pSinkUnk;
CSink *pSink;
pSink = new CSink;
hr = pSink->QueryInterface (IID_IUnknown,(void **)&pSinkUnk);
hr = pCP->Advise(pSinkUnk,&dwAdvise);
hr = pAdd->DoTest();
pCP->Unadvise(dwAdvise); //call this when you need to disconnect from
server
pCP->Release();
CoUninitialize();
----------------------------------------------------------------------------------
Here the call to Advise() is returning -2147220990. Also my callback
event
is not getting fired. I have implemented the callback interface as
below
class CSink : public ItestEvents
{
private:
DWORD m_dwRefCount;
public:
CSink();
virtual ~CSink();
STDMETHODIMP OnTest(void)
{
AfxMessageBox("OnTest");
return S_OK;
}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
{
if (iid == IID_ItestEvents)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
}
if (iid == IID_IUnknown)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
}
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef()
{
m_dwRefCount++;
return m_dwRefCount;
}
ULONG STDMETHODCALLTYPE Release()
{
ULONG l;
l = m_dwRefCount--;
if ( 0 == m_dwRefCount)
{
delete this;
}
return l;
}
};
Please advice where have i went wrong...
Thanks in advance!!!!