#include<iostream>
using namespace std;
#include"D:\project\link_obj\link_obj\link_obj_i.c"
#include"D:\project\link_obj\link_obj\link_obj_i.h"
class CSkin : public _IsobjEvents
{
public:
CSkin(void){}
~CSkin(void){}
private:
DWORD m_dwRefCount;
public:
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
{
if (iid == DIID__IsobjEvents)
{
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;
}
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
/* [out] */ __RPC__out UINT *pctinfo)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE GetTypeInfo(
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo)
{
return S_OK;
}
STDMETHOD(Msg)()
{
::MessageBoxA(NULL,"正在执行Msg函数",0,0);
return S_OK;
}
HRESULT STDMETHODCALLTYPE GetIDsOfNames(
/* [in] */ __RPC__in REFIID riid,
/* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,
/* [range][in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId)
{
return S_OK;
}
/* [local] */ HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr)
{
switch(dispIdMember) // 根据不同的dispIdMember,完成不同的回调函数,事件函数的ID编号
{
case 2:
{
// 1st param : [in] long lValue.
}
break;
default: break;
}
return S_OK;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
//创建COM对象实例
IClassFactory*pcf=NULL;
HRESULT hr=::CoGetClassObject(CLSID_sobj,CLSCTX_ALL,NULL,IID_IClassFactory,(void**)&pcf);
Isobj* obj=NULL;
hr=pcf->CreateInstance(NULL,IID_Isobj,(void**)&obj);
pcf->Release();
IConnectionPointContainer*ICPC=NULL;
hr=obj->QueryInterface(IID_IConnectionPointContainer,(void**)&ICPC);
IConnectionPoint*ICP=NULL;
hr=ICPC->FindConnectionPoint(DIID__IsobjEvents,&ICP);
CSkin *psk=new CSkin();
IUnknown* pUk=NULL;
hr=psk->QueryInterface(IID_IUnknown,(void**)&pUk);
DWORD dw;
ICP->Advise(pUk,&dw);
ICP->Unadvise(dw);
::CoUninitialize();
return 0;
}