This page is in Pre Alpha. That means no grammer checks, no editting and speeling mistakes galore! The explanations and the final version will come soon. Check it out at your own risk! a.bat set path=c:\msdev\bin;%PATH% set include=c:\msdev\include;c:\msdev\mfc\include set lib=c:\msdev\lib mktyplib ssss.odl -h zz.h rc -r ssss.rc cl.exe -c ssss.cpp link.exe -dll oleaut32.lib user32.lib gdi32.lib uuid.lib ole32.lib ssss.obj ssss.res -def:ssss.def copy ssss.dll ssss.ocx del z.txt ssss.cpp #include #include #include #include #include GUID CDECL IID_zz={0x171e4f21,0x945f,0x11cf,{0x92,0xc3,0xc1,0x2a,0x9e,0x6a,0x43,0x5d}}; HINSTANCE g_hInstance;char aa[1000];CLSID mrclsid; void abc(char *p){FILE *fp=fopen("c:\\ssss\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} class Czz : public IDispatch { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("d1");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHODIMP GetTypeInfoCount(UINT *){abc("d2");return 0;} STDMETHODIMP GetTypeInfo(UINT ,LCID ,ITypeInfo **) { abc("d3"); return E_NOINTERFACE; } STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **b,UINT ,LCID ,DISPID *a) { char ppsz[1000]; WideCharToMultiByte(CP_ACP,0,b[0],-1,ppsz,256,NULL,NULL); abc(ppsz); abc("Czz GetIDsOfNames"); *a=420; return 0; } STDMETHODIMP Invoke(DISPID dispid, REFIID,LCID,WORD flags,DISPPARAMS *, VARIANT *v,EXCEPINFO *,UINT *) { sprintf(aa," Invoke Czz %d",dispid); abc(aa); if ( dispid == DISPID_ABOUTBOX) abc("sonal"); return 0; } virtual HRESULT _stdcall get_aa(int FAR* pfFlags) { abc("get_aa"); return 0; } virtual HRESULT _stdcall put_aa(int fFlags) { abc("put_aa"); return 0; } }; Czz *m_pIzz; class CIProvideClassInfo: public IProvideClassInfo { long __stdcall QueryInterface(const struct _GUID &,void ** ) { abc("c1"); return 0; } unsigned long __stdcall AddRef(void){return 0;} unsigned long __stdcall Release(void){return 0;} TYPEKIND typeKind;ITypeLib *m_pITypeLib;ITypeInfo *m_pITypeInfo; long __stdcall GetClassInfoA(struct ITypeInfo **a ) { abc("GetClassInfoA"); GUID CDECL libID={0x171e4f20,0x945f,0x11cf,{0x92,0xc3,0xc1,0x2a,0x9e,0x6a,0x43,0x5d}}; LoadRegTypeLib(libID,1,0,0,&m_pITypeLib); sprintf(aa,"m_pITypeLib %p",m_pITypeLib); abc(aa); unsigned int typeInfoCount = m_pITypeLib->GetTypeInfoCount(); sprintf(aa,"typeInfoCount %d",typeInfoCount); abc(aa); for (unsigned int i = 0 ; i < typeInfoCount ; i++) { m_pITypeLib->GetTypeInfoType(i,&typeKind); sprintf(aa,"typeKind %d i %d",typeKind,i); abc(aa); if (typeKind==TKIND_COCLASS) m_pITypeLib->GetTypeInfo(i,&m_pITypeInfo); } *a=m_pITypeInfo; return 0; } }; CIProvideClassInfo *m_pIProvideClassInfo; class CIPersistPropertyBag: public IPersistPropertyBag { long __stdcall QueryInterface(const struct _GUID &,void ** ) { abc("p1"); return 0; } unsigned long __stdcall AddRef(void){return 0;} unsigned long __stdcall Release(void){return 0;} long __stdcall GetClassID(struct _GUID *) { abc("p4"); return 0; } long __stdcall InitNew(void) { abc("InitNew"); return 0; } long __stdcall Load(struct IPropertyBag *p,struct IErrorLog *m_pIErrorlog) { abc("Load"); VARIANT v;char ppsz[1000]; unsigned short m[] = L"SONAL"; v.vt=VT_BSTR; return 0; } long __stdcall Save(struct IPropertyBag *,int,int) { abc("p7"); return 0; } }; CIPersistPropertyBag *m_pIPersistPropertyBag; class CIQuickActivate: public IQuickActivate { long __stdcall QueryInterface(const struct _GUID &,void ** ) { abc("q1"); return 0; } unsigned long __stdcall AddRef(void) { abc("q2"); return 0; } unsigned long __stdcall Release(void) { abc("q3"); return 0; } long __stdcall QuickActivate(struct tagQACONTAINER *,struct tagQACONTROL *) { abc("QuickActivate"); return 0; } long __stdcall SetContentExtent(struct tagSIZE *) { abc("q4"); return 0; } long __stdcall GetContentExtent(struct tagSIZE *) { abc("q5"); return 0; } }; CIQuickActivate *m_pIQuickActivate; class CIConnectionPoint:public IConnectionPoint { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("81");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(GetConnectionInterface)(IID FAR* pIID){abc("82");return 0;} STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer FAR* FAR* ppCPC){abc("83");return 0;} STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD FAR* pdwCookie){abc("Advise");return 0;} STDMETHOD(Unadvise)(DWORD dwCookie){abc("Unadvise");return 0;} STDMETHOD(EnumConnections)(LPENUMCONNECTIONS FAR* ppEnum){abc("86");return 0;} }; CIConnectionPoint *m_pIConnectionPoint; class CIConnectionPointContainer:public IConnectionPointContainer { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("71");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHODIMP EnumConnectionPoints(IEnumConnectionPoints **){abc("72");return 0;} STDMETHODIMP FindConnectionPoint(REFIID riid, IConnectionPoint **p) { abc("FindConnectionPoint"); m_pIConnectionPoint = new CIConnectionPoint; *p=m_pIConnectionPoint; return 0; } }; CIConnectionPointContainer *m_pIConnectionPointContainer; class CIViewObject :public IViewObject { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("61");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(Draw)(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds,BOOL ( __stdcall *pfnContinue )(DWORD dwContinue),DWORD dwContinue) { TextOut(hdcDraw,1,1,"hello",5); abc("Draw"); return 0; } STDMETHOD(GetColorSet)(DWORD dwDrawAspect,LONG lindex, void *pvAspect,DVTARGETDEVICE *ptd, HDC hicTargetDev,LOGPALETTE * *ppColorSet){abc("GetColorSet");return 0;} STDMETHOD(Freeze)(DWORD dwDrawAspect, LONG lindex,void *pvAspect,DWORD *pdwFreeze){abc("Freeze");return 0;} STDMETHOD(Unfreeze)(DWORD dwFreeze){abc("65");return 0;} STDMETHOD(SetAdvise)(DWORD aspects, DWORD advf, IAdviseSink *pAdvSink){abc("SetAdvise");return 0;} STDMETHOD(GetAdvise)(DWORD *pAspects, DWORD *pAdvf, IAdviseSink * *ppAdvSink){abc("67");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE __RPC_FAR *ptd, LPSIZEL lpsizel){abc("68");return 0;} }; CIViewObject *m_pIViewObject; class CIDispatch : public IDispatch { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("51");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHODIMP GetTypeInfoCount(UINT *){abc("52");return 0;} STDMETHODIMP GetTypeInfo(UINT ,LCID ,ITypeInfo **) { abc("GetTypeInfo"); return E_NOINTERFACE; } STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **b,UINT ,LCID ,DISPID *a) { char ppsz[1000]; WideCharToMultiByte(CP_ACP,0,b[0],-1,ppsz,256,NULL,NULL); abc(ppsz); abc("GetIDsOfNames"); *a=420; return 0; } STDMETHODIMP Invoke(DISPID dispid, REFIID,LCID,WORD flags,DISPPARAMS *, VARIANT *v,EXCEPINFO *,UINT *) { sprintf(aa," Invoke dispid %d flags %d",dispid,flags); abc(aa); if ( dispid == DISPID_ABOUTBOX) abc("sonal"); return 0; } }; CIDispatch *m_pIDispatch; class CIPersistStorage : public IPersistStorage { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("31");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(InitNew)(IStorage *pStg){abc("InitNew");return 0;} STDMETHOD(Load)(IStorage *pStg){abc("33");return 0;} STDMETHOD(Save)(IStorage *pStgSave, BOOL fSameAsLoad){abc("34");return 0;} STDMETHOD(SaveCompleted)(IStorage *pStgNew){abc("35");return 0;} STDMETHOD(HandsOffStorage)(void){abc("HandsOffStorage");return 0;} STDMETHOD(IsDirty)(THIS){abc("37");return 0;} STDMETHOD(Load)(LPSTREAM pStm){abc("38");return 0;} STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty){abc("39");return 0;} STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* pcbSize){abc("40");return 0;} STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID){abc("41");return 0;} }; CIPersistStorage *m_pIPersistStream; class CIOleObject:public IOleObject { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(SetClientSite)(IOleClientSite *pClientSite){abc("SetClientSite");return 0;} STDMETHOD(GetClientSite)(IOleClientSite * *ppClientSite){abc("3");return 0;} STDMETHOD(SetHostNames)(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj){abc("4");return 0;} STDMETHOD(Close)(DWORD dwSaveOption){abc("Close");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("SetMoniker");return E_NOTIMPL;} STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker * *ppmk){abc("7");return 0;} STDMETHOD(InitFromData)(IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved){abc("8");return 0;} STDMETHOD(GetClipboardData)(DWORD dwReserved, IDataObject * *ppDataObject){abc("9");return 0;} STDMETHOD(DoVerb)(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect){abc("DoVerb");return 0;} STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){abc("EnumVerbs");return 0;} STDMETHOD(Update)(void){abc("11");return 0;} STDMETHOD(IsUpToDate)(void){abc("12");return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid){abc("GetUserClassID");*pClsid=mrclsid;return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel) { sprintf(aa,"SetExtent %ld..%ld",psizel->cx,psizel->cy); abc(aa); return 0; } STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { sprintf(aa,"GetExtent %ld..%ld",psizel->cx,psizel->cy); abc(aa); psizel->cx=10000; psizel->cy=10000; return 0; } STDMETHOD(Advise)(IAdviseSink *pAdvSink, DWORD *pdwConnection){abc("17");return 0;} STDMETHOD(Unadvise)(DWORD dwConnection){abc("18");return 0;} STDMETHOD(EnumAdvise)(IEnumSTATDATA * *ppenumAdvise){abc("19");return 0;} STDMETHOD(GetMiscStatus)(DWORD dwAspect, DWORD *pdwStatus) { abc("20"); return 0; } STDMETHOD(SetColorScheme)(LOGPALETTE *pLogpal){abc("21");return 0;} }; CIOleObject *m_pIOleObject; class CClassFactory:public IClassFactory { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){*ppvObjOut=(void *)this;return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(CreateInstance)(IUnknown *pUnkOuter, REFIID riid, void **ppbObjOut); STDMETHOD(LockServer)(BOOL fLock){return 1;} }; HRESULT CClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppbObjOut) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc(ppsz); sprintf(aa,"CClassFactory::CreateInstance %d",riid); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc(ppsz); sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_zz) { abc("Vijay Mukhi"); m_pIzz = new Czz; *ppvObjOut=(void *)m_pIzz; return S_OK; } if ( riid == IID_IOleCache) { abc("CIOleObject::QueryInterface IID_IOleCache"); } if ( riid == IID_IOleControl) { abc("CIOleObject::QueryInterface IID_IOleControl"); } if ( riid == IID_IOleInPlaceObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } if ( riid == IID_IPerPropertyBrowsing) { abc("CIOleObject::QueryInterface IID_IPerPropertyBrowsing"); } if ( riid == IID_IPersist) { abc("CIOleObject::QueryInterface IID_IPersist"); } if ( riid == IID_IPersistMemory) { abc("CIOleObject::QueryInterface IID_IPersistMemory"); } if ( riid == IID_ISpecifyPropertyPages) { abc("CIOleObject::QueryInterface IID_ISpecifyPropertyPages"); } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } if ( riid == IID_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); *ppvObjOut=this; return S_OK; } if ( riid == IID_IPersistPropertyBag) { abc("CIOleObject::QueryInterface IID_IPersistPropertyBag"); m_pIPersistPropertyBag = new CIPersistPropertyBag; *ppvObjOut=(void *)m_pIPersistPropertyBag; return S_OK; } if ( riid == IID_IQuickActivate) { abc("CIOleObject::QueryInterface IID_IQuickActivate"); m_pIQuickActivate = new CIQuickActivate; *ppvObjOut=(void *)m_pIQuickActivate; return S_OK; } if ( riid == IID_IProvideClassInfo || riid == IID_IProvideClassInfo2) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); m_pIProvideClassInfo = new CIProvideClassInfo; *ppvObjOut=(void *)m_pIProvideClassInfo; return S_OK; } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IDispatch) { m_pIDispatch = new CIDispatch; *ppvObjOut=(void *)m_pIDispatch; abc("CIOleObject::QueryInterface IID_IDispatch"); return S_OK; } if ( riid == IID_IConnectionPointContainer) { m_pIConnectionPointContainer = new CIConnectionPointContainer; *ppvObjOut=(void *)m_pIConnectionPointContainer; abc("CIOleObject::QueryInterface IID_IConnectionPtCtr"); return S_OK; } if ( riid == IID_IViewObject || riid == IID_IViewObject2) { m_pIViewObject = new CIViewObject; *ppvObjOut=(void *)m_pIViewObject; abc("CIOleObject::QueryInterface IID_IViewObject"); return S_OK; } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain1"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc(ppsz); abc("DllGetClassObject"); mrclsid=rclsid; CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } ssss.def DESCRIPTION 'none' EXPORTS DllGetClassObject ssss.odl #include #include [uuid(171E4F20-945F-11CF-92C3-C12A9E6A435D), version(1.0),control] library SSOCXLib { importlib(STDOLE_TLB); importlib(STDTYPE_TLB); [uuid(171E4F21-945F-11CF-92C3-C12A9E6A435D),dual,oleautomation,odl] interface _DSsocx : IDispatch { [id(300), propget] HRESULT aa([out, retval] int *pfFlags); [id(300), propput] HRESULT aa([in] int fFlags); }; [uuid(171E4F23-945F-11CF-92C3-C12A9E6A435D),control] coclass Ssocx { [default] interface _DSsocx; }; }; ssss.rc 1 TYPELIB ssss.tlb ------------------------------------------------------------------------- ssss.cpp #include #include #include #include #include DISPPARAMS dd;VARIANT vv; TYPEKIND typeKind;ITypeLib *m_pITypeLib;ITypeInfo *m_pITypeInfo;long x,y,a=3; IDispatch *m_pEvents;int draw1=0; GUID CDECL IID_zz={0x171e4f22,0x945f,0x11cf,{0x92,0xc3,0xc1,0x2a,0x9e,0x6a,0x43,0x5d}}; HINSTANCE g_hInstance;char aa[1000];CLSID mrclsid; void abc(char *p){FILE *fp=fopen("c:\\ssss\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} class CIConnectionPoint:public IConnectionPoint { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("81");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(GetConnectionInterface)(IID FAR* pIID){abc("82");return 0;} STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer FAR* FAR* ppCPC){abc("83");return 0;} STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD FAR* pdwCookie) { abc("CIConnectionPoint Advise"); m_pEvents=(IDispatch *)pUnkSink; *pdwCookie=2; return 0; } STDMETHOD(Unadvise)(DWORD dwCookie){abc("Unadvise");return 0;} STDMETHOD(EnumConnections)(LPENUMCONNECTIONS FAR* ppEnum){abc("86");return 0;} }; CIConnectionPoint *m_pIConnectionPoint; class CIConnectionPointContainer:public IConnectionPointContainer { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("71");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHODIMP EnumConnectionPoints(IEnumConnectionPoints **){abc("72");return 0;} STDMETHODIMP FindConnectionPoint(REFIID riid, IConnectionPoint **p) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc(ppsz); abc("CIConnectionPointContainer FindConnectionPoint"); if ( riid == IID_zz) { m_pIConnectionPoint = new CIConnectionPoint; *p=m_pIConnectionPoint; return 0; } return E_NOINTERFACE; } }; CIConnectionPointContainer *m_pIConnectionPointContainer; class CIViewObject :public IViewObject { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("61");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(Draw)(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds,BOOL ( __stdcall *pfnContinue )(DWORD dwContinue),DWORD dwContinue) { TextOut(hdcTargetDev,1,1,"hello",5); abc("Draw"); return 0; } STDMETHOD(GetColorSet)(DWORD dwDrawAspect,LONG lindex, void *pvAspect,DVTARGETDEVICE *ptd, HDC hicTargetDev,LOGPALETTE * *ppColorSet) { abc("GetColorSet"); return 0; } STDMETHOD(Freeze)(DWORD dwDrawAspect, LONG lindex,void *pvAspect,DWORD *pdwFreeze){abc("Freeze");return 0;} STDMETHOD(Unfreeze)(DWORD dwFreeze){abc("65");return 0;} STDMETHOD(SetAdvise)(DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) { abc("CIViewObject SetAdvise"); return 0; } STDMETHOD(GetAdvise)(DWORD *pAspects, DWORD *pAdvf, IAdviseSink * *ppAdvSink){abc("67");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE __RPC_FAR *ptd, LPSIZEL lpsizel){abc("68");return 0;} }; CIViewObject *m_pIViewObject; class CIDispatch : public IDispatch { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("51");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHODIMP GetTypeInfoCount(UINT *){abc("52");return 0;} STDMETHODIMP GetTypeInfo(UINT ,LCID ,ITypeInfo **) { abc("GetTypeInfo"); return E_NOINTERFACE; } STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **b,UINT ,LCID ,DISPID *a) { char ppsz[1000]; WideCharToMultiByte(CP_ACP,0,b[0],-1,ppsz,256,NULL,NULL); abc(ppsz); abc("GetIDsOfNames"); *a=420; return 0; } STDMETHODIMP Invoke(DISPID dispid, REFIID,LCID,WORD flags,DISPPARAMS *d, VARIANT *v,EXCEPINFO *,UINT *) { sprintf(aa,"CIDispatch Invoke dispid %d flags %d",dispid,flags); abc(aa); if ( dispid == 300 && flags == 2) { v->vt=VT_I4; v->lVal=a; } if ( dispid == 300 && flags == 4) { a = d->rgvarg[0].lVal; sprintf(aa,"Value is %ld %p",a,v); abc(aa); } if ( dispid == 500 && flags == 1) { abc("Called AboutBox"); sprintf(aa,"%p..",m_pEvents); abc(aa); //m_pEvents->QueryInterface(IID_zz,(void **)m_pEvents); sprintf(aa,"%p..",m_pEvents); abc(aa); m_pEvents->Invoke(600,IID_NULL,0,1,&dd,&vv,0,0); } return 0; } }; CIDispatch *m_pIDispatch; class CIPersistStorage : public IPersistStorage { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){abc("31");return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(InitNew)(IStorage *pStg){abc("CIPersistStorage InitNew");return 0;} STDMETHOD(Load)(IStorage *pStg) { abc("CIPersistStorage Load"); return 0; } STDMETHOD(Save)(IStorage *pStgSave, BOOL fSameAsLoad) { abc("CIPersistStorage Save"); return 0; } STDMETHOD(SaveCompleted)(IStorage *pStgNew){abc("CIPersistStorage SaveCompleted");return 0;} STDMETHOD(HandsOffStorage)(void){abc("HandsOffStorage");return 0;} STDMETHOD(IsDirty)(THIS){abc("CIPersistStorage IsDirty");return 0;} STDMETHOD(Load)(LPSTREAM pStm){abc("38");return 0;} STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty){abc("39");return 0;} STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* pcbSize){abc("40");return 0;} STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID) { abc("CIPersistStorage GetClassID"); return 0; } }; CIPersistStorage *m_pIPersistStream; class CIOleObject:public IOleObject { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(SetClientSite)(IOleClientSite *pClientSite) { abc("SetClientSite"); return 0; } STDMETHOD(GetClientSite)(IOleClientSite * *ppClientSite){abc("3");return 0;} STDMETHOD(SetHostNames)(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj){abc("4");return 0;} STDMETHOD(Close)(DWORD dwSaveOption) { abc("CIOleObject Close"); return 0; } STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("SetMoniker");return E_NOTIMPL;} STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker * *ppmk){abc("7");return 0;} STDMETHOD(InitFromData)(IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved){abc("8");return 0;} STDMETHOD(GetClipboardData)(DWORD dwReserved, IDataObject * *ppDataObject){abc("9");return 0;} STDMETHOD(DoVerb)(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect){abc("DoVerb");return 0;} STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){abc("EnumVerbs");return 0;} STDMETHOD(Update)(void) { abc("CIOleObject Update"); return 0; } STDMETHOD(IsUpToDate)(void){abc("12");return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid){abc("GetUserClassID");*pClsid=mrclsid;return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel) { y=psizel->cy; x=psizel->cx; sprintf(aa,"CIOleObject SetExtent %ld..%ld",psizel->cx,psizel->cy); abc(aa); return 0; } STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { sprintf(aa,"CIOleObject GetExtent %ld..%ld",psizel->cx,psizel->cy); abc(aa); psizel->cx=x; psizel->cy=y; return 0; } STDMETHOD(Advise)(IAdviseSink *pAdvSink, DWORD *pdwConnection){abc("17");return 0;} STDMETHOD(Unadvise)(DWORD dwConnection){abc("18");return 0;} STDMETHOD(EnumAdvise)(IEnumSTATDATA * *ppenumAdvise){abc("19");return 0;} STDMETHOD(GetMiscStatus)(DWORD dwAspect, DWORD *pdwStatus) { abc("20"); return 0; } STDMETHOD(SetColorScheme)(LOGPALETTE *pLogpal){abc("21");return 0;} }; CIOleObject *m_pIOleObject; class CClassFactory:public IClassFactory { STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){*ppvObjOut=(void *)this;return 0;} STDMETHOD_(ULONG, AddRef)(void){return 1;} STDMETHOD_(ULONG, Release)(void){return 1;} STDMETHOD(CreateInstance)(IUnknown *pUnkOuter, REFIID riid, void **ppbObjOut); STDMETHOD(LockServer)(BOOL fLock){return 1;} }; HRESULT CClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppbObjOut) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); //abc(ppsz); sprintf(aa,"CClassFactory::CreateInstance %d",riid); //abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc(ppsz); sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IOleControl) { abc("CIOleObject::QueryInterface IID_IOleControl"); } if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); *ppvObjOut=this; return S_OK; } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IDispatch) { m_pIDispatch = new CIDispatch; *ppvObjOut=(void *)m_pIDispatch; abc("CIOleObject::QueryInterface IID_IDispatch"); return S_OK; } if ( riid == IID_IConnectionPointContainer) { m_pIConnectionPointContainer = new CIConnectionPointContainer; *ppvObjOut=(void *)m_pIConnectionPointContainer; abc("CIOleObject::QueryInterface IID_IConnectionPtCtr"); return S_OK; } if ( riid == IID_IViewObject || riid == IID_IViewObject2) { m_pIViewObject = new CIViewObject; *ppvObjOut=(void *)m_pIViewObject; abc("CIOleObject::QueryInterface IID_IViewObject"); return S_OK; } return E_NOINTERFACE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); //abc(ppsz); //abc("DllGetClassObject"); mrclsid=rclsid; CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } ssss.def DESCRIPTION 'none' EXPORTS DllGetClassObject ssss.odl #include #include [uuid(171E4F20-945F-11CF-92C3-C12A9E6A435D), version(1.0),control] library SSOCXLib { importlib(STDOLE_TLB); importlib(STDTYPE_TLB); [uuid(171E4F21-945F-11CF-92C3-C12A9E6A435D),dual,oleautomation,odl] interface _DSsocx : IDispatch { [id(300), propget] HRESULT aa([out, retval] int *pfFlags); [id(300), propput] HRESULT aa([in] int fFlags); [id(500)] void AboutBox(); }; [ uuid(171E4F22-945F-11CF-92C3-C12A9E6A435D)] dispinterface _DSsocxEvents { properties: methods: [id(600)] void OnBeginNavigate(); }; [ uuid(171E4F23-945F-11CF-92C3-C12A9E6A435D),control] coclass Ssocx { [default] interface _DSsocx; [default, source] dispinterface _DSsocxEvents; }; }; ssss.rc 1 TYPELIB ssss.tlb ------------------------------------------------------------------------