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! m1.cpp #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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("2");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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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("10");return 0;} STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){abc("1");return 0;} STDMETHOD(Update)(void){abc("11");return 0;} STDMETHOD(IsUpToDate)(void){abc("12");return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid){abc("13");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("15");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel){abc("16");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) *ppvObjOut=(void *)this; return 0; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m2.cpp #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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("2");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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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("10");return 0;} STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){abc("1");return 0;} STDMETHOD(Update)(void){abc("11");return 0;} STDMETHOD(IsUpToDate)(void){abc("12");return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid){abc("13");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("15");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel){abc("16");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { *ppvObjOut=(void *)this; abc("CIOleObject::QueryInterface IID_IOleObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m3.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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("32");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("36");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("2");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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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("10");return 0;} STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){abc("1");return 0;} STDMETHOD(Update)(void){abc("11");return 0;} STDMETHOD(IsUpToDate)(void){abc("12");return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid){abc("13");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("15");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel){abc("16");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { *ppvObjOut=(void *)this; abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); return E_NOINTERFACE; } if ( riid == IID_IDispatch) { abc("CIOleObject::QueryInterface IID_IDispatch"); } if ( riid == IID_IConnectionPointContainer) { abc("CIOleObject::QueryInterface IID_IConnectionPtCtr"); } if ( riid == IID_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { abc("CIOleObject::QueryInterface IID_IViewObject"); } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m4.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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("32");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("36");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("2");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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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("10");return 0;} STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){abc("1");return 0;} STDMETHOD(Update)(void){abc("11");return 0;} STDMETHOD(IsUpToDate)(void){abc("12");return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid){abc("13");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("15");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel){abc("16");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } if ( riid == IID_IDispatch) { abc("CIOleObject::QueryInterface IID_IDispatch"); } if ( riid == IID_IConnectionPointContainer) { abc("CIOleObject::QueryInterface IID_IConnectionPtCtr"); } if ( riid == IID_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { abc("CIOleObject::QueryInterface IID_IViewObject"); } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m5.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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("32");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("36");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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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("10");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");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("SetExtent");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { psizel->cx=10; psizel->cy=10; abc("GetExtent");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } if ( riid == IID_IDispatch) { abc("CIOleObject::QueryInterface IID_IDispatch"); } if ( riid == IID_IConnectionPointContainer) { abc("CIOleObject::QueryInterface IID_IConnectionPtCtr"); } if ( riid == IID_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { abc("CIOleObject::QueryInterface IID_IViewObject"); } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m6.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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("53");return 0;} STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **,UINT ,LCID ,DISPID *){abc("54");return 0;} STDMETHODIMP Invoke(DISPID, REFIID,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,UINT *){abc("55");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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("SetExtent");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { psizel->cx=10; psizel->cy=10; abc("GetExtent");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } if ( riid == IID_IDispatch) { m_pIDispatch = new CIDispatch; *ppvObjOut=(void *)m_pIDispatch; abc("CIOleObject::QueryInterface IID_IDispatch"); return S_OK; } if ( riid == IID_IConnectionPointContainer) { abc("CIOleObject::QueryInterface IID_IConnectionPtCtr"); } if ( riid == IID_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { abc("CIOleObject::QueryInterface IID_IViewObject"); } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m7.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} 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, IConnectionPoint **){abc("73");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){abc("62");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("64");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("53");return 0;} STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **,UINT ,LCID ,DISPID *){abc("54");return 0;} STDMETHODIMP Invoke(DISPID dispid, REFIID,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,UINT *) { sprintf(aa," Invoke %d",dispid); abc(aa); 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("5");return 0;} STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){abc("6");return 0;} 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");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("SetExtent");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { psizel->cx=10; psizel->cy=10; abc("GetExtent");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } 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_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { m_pIViewObject = new CIViewObject; *ppvObjOut=(void *)m_pIViewObject; abc("CIOleObject::QueryInterface IID_IViewObject"); return S_OK; } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m8.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000]; void abc(char *p){FILE *fp=fopen("c:\\beans\\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("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){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("53");return 0;} STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **,UINT ,LCID ,DISPID *){abc("54");return 0;} STDMETHODIMP Invoke(DISPID dispid, REFIID,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,UINT *) { sprintf(aa," Invoke %d",dispid); abc(aa); 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("6");return 0;} 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");return 0;} STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){abc("14");return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel){abc("SetExtent");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { psizel->cx=10; psizel->cy=10; abc("GetExtent");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } 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_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { m_pIViewObject = new CIViewObject; *ppvObjOut=(void *)m_pIViewObject; abc("CIOleObject::QueryInterface IID_IViewObject"); return S_OK; } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m9.cpp #include #include #include HINSTANCE g_hInstance;char aa[1000];CLSID mrclsid; void abc(char *p){FILE *fp=fopen("c:\\beans\\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("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){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("53");return 0;} STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **,UINT ,LCID ,DISPID *){abc("54");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); 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("6");return 0;} 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){abc("SetExtent");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { psizel->cx=10; psizel->cy=10; abc("GetExtent");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } 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_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { m_pIViewObject = new CIViewObject; *ppvObjOut=(void *)m_pIViewObject; abc("CIOleObject::QueryInterface IID_IViewObject"); return S_OK; } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); mrclsid=rclsid; CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } m10.cpp #include #include #include #include JNIEnv *g_env;JavaVM *g_vm;WNDCLASS wc; long _stdcall ControlWindowProc(HWND w,UINT x,WPARAM y,LPARAM z) { return DefWindowProc(w,x,y,z); } HINSTANCE g_hInstance;char aa[1000];CLSID mrclsid;HANDLE g_hHeap; void abc(char *p){FILE *fp=fopen("c:\\beans\\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("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){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("53");return 0;} STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **,UINT ,LCID ,DISPID *){abc("54");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); 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("6");return 0;} 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) { sprintf(aa,"DoVerb %d",iVerb); abc(aa); if ( iVerb == -5) { JDK1_1InitArgs args; _jobject *m_jClass,*res,*m_frame; _jmethodID *addBean,*createBeanFrame,*constructor; _jstring *beanName,*jarFileName ; _jclass *clazz,*oleInterface; HWND ww; wc.hInstance=g_hInstance;wc.lpfnWndProc=ControlWindowProc; wc.lpszClassName="a1"; ::RegisterClass(&wc); ww=CreateWindowEx(WS_EX_CONTROLPARENT|WS_EX_NOPARENTNOTIFY,"a1", "a1", WS_OVERLAPPED, 0, 0, 100, 100, NULL, NULL,g_hInstance, this); SetWindowLong(ww, GWL_STYLE, (WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)); JNI_GetDefaultJavaVMInitArgs(&args); args.classpath = "c:\\bdk\\bridge\\classes;C:\\jdk1.1\\lib\\classes.zip"; JNI_CreateJavaVM(&g_vm, &g_env, &args); oleInterface = g_env->FindClass("sun/beans/ole/OleBeanInterface"); m_jClass = g_env->NewGlobalRef(oleInterface); addBean = g_env->GetStaticMethodID((class _jclass *)m_jClass, "addBean", "(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/Object;"); beanName = g_env->NewStringUTF("sunw.demo.juggler.Juggler"); jarFileName = g_env->NewStringUTF("c:\\bdk\\bridge\\jars\\Juggler.jar"); res = g_env->CallStaticObjectMethod((jclass) m_jClass, addBean, jarFileName, beanName, (long) 0); clazz = g_env->FindClass("sun/awt/windows/WEmbeddedFrame"); constructor = g_env->GetMethodID(clazz, "", "(I)V"); m_frame = g_env->NewObject(clazz, constructor, ww); createBeanFrame = g_env->GetMethodID((jclass) m_jClass, "createBeanWindow", "(Lsun/awt/EmbeddedFrame;)V"); g_env->CallObjectMethod(res, createBeanFrame , m_frame); SetWindowPos(ww,0,1,1,100,100,0); SetWindowLong(ww, GWL_STYLE,(WS_CHILD|WS_CLIPSIBLINGS | WS_CLIPCHILDREN)); ::SetParent(ww, hwndParent); ShowWindow(ww, SW_SHOW); } 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){abc("SetExtent");return 0;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel) { psizel->cx=10; psizel->cy=10; abc("GetExtent");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) { sprintf(aa,"CClassFactory::CreateInstance %d",IID_IOleObject); abc(aa); m_pIOleObject = new CIOleObject; *ppbObjOut=(void *)m_pIOleObject; return 0; } HRESULT CIOleObject::QueryInterface(REFIID riid, void **ppvObjOut) { sprintf(aa,"CIOleObject::QueryInterface %ld",riid); abc(aa); if ( riid == IID_IUnknown || riid == IID_IOleObject) { abc("CIOleObject::QueryInterface IID_IOleObject"); } if ( riid == IID_IProvideClassInfo) { abc("CIOleObject::QueryInterface IID_IProvideClassInfo"); } if ( riid == IID_IPersistStorage ) { m_pIPersistStream = new CIPersistStorage; *ppvObjOut=(void *)m_pIPersistStream; abc("CIOleObject::QueryInterface IID_IPersistStorage"); return S_OK; } if ( riid == IID_IPersistStreamInit ) { abc("CIOleObject::QueryInterface IID_IPersistStreamInit"); } 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_IDataObject) { abc("CIOleObject::QueryInterface IID_IDataObject"); } if ( riid == IID_IViewObject) { m_pIViewObject = new CIViewObject; *ppvObjOut=(void *)m_pIViewObject; abc("CIOleObject::QueryInterface IID_IViewObject"); return S_OK; } if ( riid == IID_IOleInPlaceObject || riid == IID_IOleInPlaceActiveObject) { abc("CIOleObject::QueryInterface IID_IOleInPlaceObject"); } return E_NOINTERFACE; } STDAPI DllCanUnloadNow(void){return S_FALSE;} BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { abc("DllMain"); if ( dwReason == DLL_PROCESS_ATTACH) { g_hInstance = (HINSTANCE)hInstance; } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("DllGetClassObject"); mrclsid=rclsid; CClassFactory *pv; pv = new CClassFactory(); *ppvObjOut=(void *)pv; return 0; } dllserver.cpp #include #include #include #include #include #include #include #include #include #include #include void abc(char *p){FILE *fp=fopen("c:\\beansc\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} jmethodID getBlue, getGreen, getRed,s_getName, s_getStyle, s_getSize; FONTDESC fontDesc; IStream *m_pIStream; IUnknown *m_rgSinks; IID m_iid;char aa[300]; long m_propertyNb; jmethodID m_jInvoke, m_jPropertySet, m_jPropertyGet; LPSTR ValueFromKey(LPSTR clsid, LPSTR subKey); CLSID m_rclsid;LPSTR m_szJarFileName,m_szClassName,m_szInterfaceClassName; HWND m_hWnd;HINSTANCE g_hInstance; JNIEnv *g_env;JavaVM *g_vm; class CConnectionPtCtr; LRESULT CALLBACK ControlWindowProc(HWND w, UINT x, WPARAM y, LPARAM z){return DefWindowProc(w, x, y, z);} void PixelToHiMetric(const SIZEL * lpSizeInPix, LPSIZEL lpSizeInHiMetric); void HiMetricToPixel(const SIZEL * lpSizeInHiMetric, LPSIZEL lpSizeInPix); #define HIMETRIC_PER_INCH 2540 #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli)) #define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH) int s_iXppli,s_iYppli; WNDCLASS wc; jref m_jClass,m_jBean; jobject m_frame; BOOL createControlWindow(); void setControlSize(SIZEL*); void getControlSize(SIZEL *); class CClassFactory : public IClassFactory { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut){return 0;} STDMETHOD_(ULONG, AddRef)(void){return 0;} STDMETHOD_(ULONG, Release)(void){return 0;} STDMETHOD(CreateInstance)(IUnknown *, REFIID , void **); STDMETHOD(LockServer)(BOOL fLock){return 0;} }; class CConnectionPoint : public IConnectionPoint { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) { return 0; } STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHOD(GetConnectionInterface)(IID FAR* pIID){return S_OK;} STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer FAR* FAR* ppCPC){return S_OK;} STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD FAR* pdwCookie); STDMETHOD(Unadvise)(DWORD dwCookie){ return 0; } STDMETHOD(EnumConnections)(LPENUMCONNECTIONS FAR* ppEnum){return S_OK;} }; IConnectionPoint *m_pConnectionPoint; class CConnectionPtCtr :public IConnectionPointContainer { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) {return 0;} STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHODIMP EnumConnectionPoints(IEnumConnectionPoints **){return 0;} STDMETHODIMP FindConnectionPoint(REFIID, IConnectionPoint **); }; HRESULT getSourceInterfaceIID(REFIID); HRESULT initializeConnectionPointOn(); class CDispatch : public IDispatch { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) { return 0; } STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHODIMP GetTypeInfoCount(UINT *){return 0;} STDMETHODIMP GetTypeInfo(UINT ,LCID ,ITypeInfo **){return 0;} STDMETHODIMP GetIDsOfNames(REFIID ,OLECHAR **,UINT ,LCID ,DISPID *){return 0;} STDMETHODIMP Invoke(DISPID, REFIID,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,UINT *); STDMETHODIMP propertyGet(DISPID, VARIANT *); STDMETHODIMP propertySet(DISPID, DISPPARAMS *); }; class CJavaDispatch: public IUnknown { public: STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void){return 0;} STDMETHODIMP_(ULONG) Release(void){return 0;} }; class CJavaObject { public : virtual HRESULT storeInVariant(jobject, VARIANT *, BOOL); }; class COleControl : public IOleControl { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) { return 0; } STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHOD(GetControlInfo)(LPCONTROLINFO pCI){return S_OK;} STDMETHOD(OnMnemonic)(LPMSG pMsg){return S_OK;} STDMETHOD(OnAmbientPropertyChange)(DISPID dispid){return S_OK;} STDMETHOD(FreezeEvents)(BOOL bFreeze){return S_OK;} }; class COleInPlace : public IOleInPlaceObject{ public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) { return 0; } STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHOD(GetWindow)(HWND *phwnd){return S_OK;} STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode){return S_OK;} STDMETHOD(InPlaceDeactivate)(void){return S_OK;} STDMETHOD(UIDeactivate)(void){return S_OK;} STDMETHOD(SetObjectRects)(LPCRECT lprcPosRect,LPCRECT lprcClipRect){return S_OK;} STDMETHOD(ReactivateAndUndo)(void){return E_NOTIMPL;} STDMETHODIMP InPlaceActivate(IOleClientSite * , BOOL); STDMETHODIMP UIActivate(){return S_OK;} IOleInPlaceSite *m_pInPlaceSite; IOleInPlaceFrame *m_pInPlaceFrame; IOleInPlaceUIWindow *m_pInPlaceUIWindow; }; class CPersist :public IPersistStreamInit { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) { return 0; } STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID); STDMETHOD(Load)(LPSTREAM pStm); STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty); STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* pcbSize){return E_NOTIMPL;} STDMETHOD(IsDirty)(THIS){return S_FALSE;} STDMETHOD(InitNew)(); }; HRESULT GetClassInfo(ITypeInfo **ppvObjOut); class CViewObject : public IViewObject2 { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut) { return 0; } STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } 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){return 0;} STDMETHOD(GetColorSet)(DWORD dwDrawAspect,LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE * *ppColorSet){return E_NOTIMPL;} STDMETHOD(Freeze)(DWORD dwDrawAspect, LONG lindex,void *pvAspect,DWORD *pdwFreeze){return E_NOTIMPL;} STDMETHOD(Unfreeze)(DWORD dwFreeze){return E_NOTIMPL;} STDMETHOD(SetAdvise)(DWORD aspects, DWORD advf, IAdviseSink *pAdvSink){return S_OK;} STDMETHOD(GetAdvise)(DWORD *pAspects, DWORD *pAdvf, IAdviseSink * *ppAdvSink){return S_OK;} STDMETHOD(GetExtent)(DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE __RPC_FAR *ptd, LPSIZEL lpsizel){return E_FAIL;} }; class COleStream { public : COleStream(IStream *); jobject InitInstance(JNIEnv * , BOOL); virtual HRESULT write(JNIEnv *, IStream *, jbyteArray , int , int ); virtual long read(JNIEnv *, IStream *, jbyteArray , int , int ); virtual int available(IStream *); }; class COleObject : public IOleObject { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void) { return 0; } STDMETHOD_(ULONG, Release)(void) { return 0; } STDMETHOD(SetClientSite)(IOleClientSite *pClientSite){return 0;} STDMETHOD(GetClientSite)(IOleClientSite * *ppClientSite){return 0;} STDMETHOD(SetHostNames)(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj){return 0;} STDMETHOD(Close)(DWORD dwSaveOption); STDMETHOD(SetMoniker)(DWORD dwWhichMoniker, IMoniker *pmk){return 0;} STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker * *ppmk){return E_NOTIMPL;} STDMETHOD(InitFromData)(IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved){return E_NOTIMPL;} STDMETHOD(GetClipboardData)(DWORD dwReserved, IDataObject * *ppDataObject){return E_NOTIMPL;} STDMETHOD(DoVerb)(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect); STDMETHOD(EnumVerbs)(IEnumOLEVERB * *ppEnumOleVerb){return 0;} STDMETHOD(Update)(void){return 0;} STDMETHOD(IsUpToDate)(void){return 0;} STDMETHOD(GetUserClassID)(CLSID *pClsid); STDMETHOD(GetUserType)(DWORD dwFormOfType, LPOLESTR *pszUserType){return 0;} STDMETHOD(SetExtent)(DWORD dwDrawAspect,LPSIZEL psizel); STDMETHOD(GetExtent)(DWORD dwDrawAspect, LPSIZEL psizel); STDMETHOD(Advise)(IAdviseSink *pAdvSink, DWORD *pdwConnection){return 0;} STDMETHOD(Unadvise)(DWORD dwConnection){return 0;} STDMETHOD(EnumAdvise)(IEnumSTATDATA * *ppenumAdvise){return 0;} STDMETHOD(GetMiscStatus)(DWORD dwAspect, DWORD *pdwStatus){return 0;} STDMETHOD(SetColorScheme)(LOGPALETTE *pLogpal){return 0;} }; COleStream::COleStream(IStream *pIStream){m_pIStream=pIStream;} COleInPlace *m_pCOleInPlace; CConnectionPtCtr *m_pCConnectionPtCtr; CDispatch *m_pIDispatch; COleControl *m_pCOleControl; COleObject *m_pCOleObject; CPersist *m_pCPersist; CViewObject *m_pCViewObject; HRESULT _stdcall COleObject::QueryInterface(REFIID riid, void **ppvObjOut) { if ( riid == IID_IConnectionPointContainer) { abc("COleObject::QueryInterface IID_IConnectionPointContainer"); *ppvObjOut=(void *)(IConnectionPointContainer*)m_pCConnectionPtCtr; return 0; } if ( riid == IID_IDispatch) { abc("COleObject::QueryInterface IID_IDispatch"); *ppvObjOut=(void *)(IDispatch*)m_pIDispatch; return 0; } if ( riid == IID_IOleControl) { abc("COleObject::QueryInterface IID_IOleControl"); *ppvObjOut=(void *)(IOleControl*)m_pCOleControl; return 0; } if ( riid == IID_IPersistStreamInit) { abc("COleObject::QueryInterface IID_IPersistStreamInit"); *ppvObjOut=(void *)(IPersistStreamInit*)m_pCPersist; return 0; } if ( riid == IID_IViewObject) { abc("COleObject::QueryInterface IID_IViewObject"); *ppvObjOut=(void *)(IViewObject*)m_pCViewObject; return 0; } if ( riid == IID_IOleInPlaceObject) { abc("COleObject::QueryInterface IID_IOleInPlaceObject"); *ppvObjOut=(void *)(IOleInPlaceObject*)m_pCOleInPlace; return 0; } *ppvObjOut = NULL; return E_NOINTERFACE; } //// BOOL WINAPI DllMain (HANDLE hInstance, DWORD dwReason, void *pvReserved) { if ( dwReason == DLL_PROCESS_ATTACH) { abc("Dllserver DllMain"); g_hInstance = (HINSTANCE)hInstance; wc.hInstance=g_hInstance; wc.lpfnWndProc=ControlWindowProc; wc.lpszClassName="BEANSCONTROLWINDOW"; ::RegisterClass(&wc); char javaLIB[512];char szModuleFileName[512]; GetEnvironmentVariable("CLASSPATH", javaLIB, 512); abc(javaLIB); JDK1_1InitArgs args; JNI_GetDefaultJavaVMInitArgs(&args); args.classpath = javaLIB; JNI_CreateJavaVM(&g_vm, &g_env, &args); jclass clazz=g_env->FindClass("sun/beans/ole/OleBeanInterface"); jmethodID init=g_env->GetStaticMethodID(clazz,"initEnvironment","(Ljava/lang/String;)V"); GetModuleFileName(NULL, szModuleFileName, 512); abc(szModuleFileName); jstring moduleName = g_env->NewStringUTF(szModuleFileName); g_env->CallStaticVoidMethod(clazz, init, moduleName); } return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppvObjOut) { abc("Dllserver DllGetClassObject"); char temp[256]; LPOLESTR CLSIDString; StringFromCLSID(rclsid, &CLSIDString); WideCharToMultiByte(CP_ACP , 0 , CLSIDString, -1 , temp, 256 , NULL ,NULL); abc(temp); m_szJarFileName = ValueFromKey(temp, "JarFileName"); abc(m_szJarFileName); m_szClassName = ValueFromKey(temp,"JavaClass"); abc(m_szClassName); m_szInterfaceClassName = ValueFromKey(temp, "InterfaceClass"); abc(m_szInterfaceClassName); if (!m_szInterfaceClassName) strcpy(m_szInterfaceClassName, "sun/beans/ole/OleBeanInterface"); m_rclsid=rclsid; *ppvObjOut=(void *)new CClassFactory(); return 0; } LPSTR ValueFromKey(LPSTR clsid, LPSTR subKey) { abc("Dllserver ValueFromKey"); HKEY key;LPSTR str;unsigned long dwType, cbData=256; str = (LPSTR) new char[256]; sprintf(str,"CLSID\\%s\\%s", clsid, subKey); RegOpenKeyEx(HKEY_CLASSES_ROOT, (LPCSTR) str, 0, KEY_READ, &key); RegQueryValueEx(key,NULL, NULL, &dwType, (unsigned char *) str, &cbData); RegCloseKey(key); return str; } STDMETHODIMP CClassFactory::CreateInstance(IUnknown *,REFIID riid,void **ppvObjOut) { abc("CClassFactory::CreateInstance"); m_pIDispatch=new CDispatch(); m_pCConnectionPtCtr=new CConnectionPtCtr(); m_pCPersist=new CPersist(); m_pCOleObject=new COleObject(); m_pCViewObject=new CViewObject(); m_pCOleInPlace=new COleInPlace(); m_pCOleControl=new COleControl(); jclass oleInterface = g_env->FindClass(m_szInterfaceClassName); m_jClass = g_env->NewGlobalRef(oleInterface); *ppvObjOut=(void *)m_pCOleObject; return 0; } STDMETHODIMP CPersist::InitNew(void) { abc("CPersist::InitNew"); jmethodID addBean = g_env->GetStaticMethodID((jclass) m_jClass, "addBean", "(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/Object;"); jstring beanName = g_env->NewStringUTF(m_szClassName); jstring jarFileName = g_env->NewStringUTF(m_szJarFileName); jobject res = g_env->CallStaticObjectMethod((jclass) m_jClass, addBean, jarFileName, beanName, (long) 0); m_jBean = g_env->NewGlobalRef(res); initializeConnectionPointOn(); createControlWindow(); SIZEL initialSize; jmethodID getPreferredWidth = g_env->GetMethodID((jclass) m_jClass, "getPreferredWidth", "()I"); initialSize.cx=g_env->CallIntMethod(m_jBean, getPreferredWidth); jmethodID getPreferredHeight = g_env->GetMethodID((jclass) m_jClass, "getPreferredHeight", "()I"); initialSize.cy=g_env->CallIntMethod(m_jBean, getPreferredHeight);; sprintf(aa,"cy=%d cx=%d",initialSize.cy,initialSize.cx); abc(aa); setControlSize(&initialSize); jmethodID getNumberOfProperties = g_env->GetMethodID((jclass) m_jClass, "getNumberOfProperties","()I"); m_propertyNb=g_env->CallIntMethod(m_jBean,getNumberOfProperties); sprintf(aa,"m_propertyNb %d",m_propertyNb); abc(aa); HDC hDCScreen=GetDC(NULL); s_iXppli = GetDeviceCaps(hDCScreen, LOGPIXELSX); s_iYppli = GetDeviceCaps(hDCScreen, LOGPIXELSY); sprintf(aa,"s_iXppli=%d s_iYppli=%d",s_iXppli,s_iYppli); abc(aa); ReleaseDC(NULL, hDCScreen); return S_OK; } HRESULT initializeConnectionPointOn() { abc("CConnectionPtCtr::initializeConnectionPointOn"); m_pConnectionPoint = new CConnectionPoint(); jmethodID addOleEventListenersFor = g_env->GetMethodID((jclass) m_jClass, "addOleEventListenersFor","(II)Z"); g_env->CallBooleanMethod(m_jBean,addOleEventListenersFor,m_pConnectionPoint, m_pConnectionPoint); return S_OK; } BOOL createControlWindow() { abc("COMObject::createControlWindow"); m_hWnd=CreateWindowEx(WS_EX_NOPARENTNOTIFY, "BEANSCONTROLWINDOW", "hell", WS_OVERLAPPED,0,0,100,100,0,0,g_hInstance, 0); SetWindowLong(m_hWnd,GWL_STYLE,(WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN)); jclass clazz = g_env->FindClass("sun/awt/windows/WEmbeddedFrame"); jmethodID constructor = g_env->GetMethodID(clazz, "", "(I)V"); m_frame = g_env->NewObject(clazz, constructor, m_hWnd); jmethodID createBeanFrame = g_env->GetMethodID((jclass) m_jClass, "createBeanWindow", "(Lsun/awt/EmbeddedFrame;)V"); g_env->CallObjectMethod(m_jBean, createBeanFrame , m_frame); return TRUE; } void setControlSize(SIZEL *size) { abc("COMObject::setControlSize"); jmethodID setSize = g_env->GetMethodID((jclass) m_jClass, "setSize", "(II)V"); g_env->CallVoidMethod(m_jBean, setSize, size->cx, size->cy); } STDMETHODIMP COleObject::SetExtent(DWORD dwDrawAspect,LPSIZEL psizel) { abc("COleObject::SetExtent"); SIZEL size; sprintf(aa,"Before HiMetricToPixel cx=%d cy=%d",psizel->cx,psizel->cy); abc(aa); HiMetricToPixel(psizel, &size); sprintf(aa,"After HiMetricToPixel cx=%d cy=%d",size.cx,size.cy); abc(aa); setControlSize(&size); SetWindowPos(m_hWnd, NULL, 0, 0, size.cx, size.cy,0); return S_OK; } void HiMetricToPixel(const SIZEL * lpSizeInHiMetric, LPSIZEL lpSizeInPix) { abc("Utils HiMetricToPixel"); lpSizeInPix->cx = MAP_LOGHIM_TO_PIX(lpSizeInHiMetric->cx, s_iXppli); lpSizeInPix->cy = MAP_LOGHIM_TO_PIX(lpSizeInHiMetric->cy, s_iYppli); } STDMETHODIMP COleObject::GetExtent(DWORD dwDrawAspect,LPSIZEL pSizeLOut) { abc("COleObject::GetExtent"); SIZEL controlSize; getControlSize(&controlSize); sprintf(aa,"Before PixelToHiMetric cx %d cy %d",controlSize.cx,controlSize.cy); abc(aa); PixelToHiMetric((const SIZEL *) &controlSize, pSizeLOut); sprintf(aa,"After PixelToHiMetric cx %d cy %d",pSizeLOut->cx,pSizeLOut->cy); abc(aa); return S_OK; } void getControlSize(SIZEL *size) { abc("COMObject::getControlSize"); jmethodID getBounds = g_env->GetMethodID((jclass) m_jClass, "getBounds", "()Ljava/awt/Rectangle;"); jobject jRect = g_env->CallObjectMethod(m_jBean, getBounds); jfieldID width=g_env->GetFieldID(g_env->GetObjectClass(jRect),"width", "I"); size->cx = g_env->GetIntField(jRect, width); jfieldID height=g_env->GetFieldID(g_env->GetObjectClass(jRect),"height","I"); size->cy = g_env->GetIntField(jRect, height); } void PixelToHiMetric(const SIZEL * lpSizeInPix, LPSIZEL lpSizeInHiMetric) { abc("PixelToHiMetric"); lpSizeInHiMetric->cx = MAP_PIX_TO_LOGHIM(lpSizeInPix->cx, s_iXppli); lpSizeInHiMetric->cy = MAP_PIX_TO_LOGHIM(lpSizeInPix->cy, s_iYppli); } STDMETHODIMP COleObject::GetUserClassID(CLSID *pclsid) { abc("COleObject::GetUserClassID"); *pclsid = m_rclsid; return S_OK; } STDMETHODIMP CConnectionPtCtr::FindConnectionPoint(REFIID riid, IConnectionPoint **ppConnectionPoint) { LPOLESTR s;char z[100];char aa[100]; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,z,256,NULL,NULL); sprintf(aa,"CConnectionPtCtr::FindConnectionPoint %s",z); abc(aa); getSourceInterfaceIID(m_iid); StringFromCLSID(m_iid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,z,256,NULL,NULL); sprintf(aa,"CConnectionPtCtr::FindConnectionPoint getSourceInterfaceIID %s",z); abc(aa); if (riid==m_iid || riid==IID_IDispatch) { *ppConnectionPoint = m_pConnectionPoint; return S_OK; } return E_NOINTERFACE; } HRESULT getSourceInterfaceIID(REFIID interfaceID) { abc("CConnectionPtCtr::getSourceInterfaceIID"); ITypeInfo *pTypeInfo,*pType; TYPEATTR *pTypeAttr; GetClassInfo(&pType); HREFTYPE refType; pType->GetRefTypeOfImplType(0, &refType); pType->GetRefTypeInfo(refType, &pTypeInfo); pTypeInfo->GetTypeAttr(&pTypeAttr); memcpy((void *) &interfaceID, (void *) &(pTypeAttr->guid), sizeof(GUID)); return S_OK; } HRESULT GetClassInfo(ITypeInfo **ppvObjOut) { abc("CProvideClassInfo::GetClassInfo"); ITypeLib *pTypeLib; ITypeInfo *m_typeInfo; unsigned int typeInfoCount; TYPEKIND typeKind; char regKeyName[1024],typeLib[256]; unsigned short unicode[256]; HKEY key; unsigned long dwType, cbData = 256; CLSID libID; LPOLESTR CLSIDString; char *charPtr=(char *) new char[256]; StringFromCLSID(m_rclsid, &CLSIDString); WideCharToMultiByte(CP_ACP ,0,CLSIDString, -1 , charPtr, 256 , NULL ,NULL); sprintf(regKeyName,"CLSID\\%s\\TypeLib", charPtr); RegOpenKeyEx(HKEY_CLASSES_ROOT, (LPCSTR) regKeyName, 0, KEY_READ, &key); RegQueryValueEx(key,NULL, NULL, &dwType, (unsigned char *) typeLib, &cbData); RegCloseKey(key); MultiByteToWideChar(CP_ACP , 0 , typeLib, -1 , unicode, 256); CLSIDFromString(unicode, &libID); LoadRegTypeLib(libID, 1,0,0, &pTypeLib); typeInfoCount = pTypeLib->GetTypeInfoCount(); for (unsigned int i = 0 ; i < typeInfoCount ; i++) { pTypeLib->GetTypeInfoType(i, &typeKind); if (typeKind==TKIND_COCLASS) pTypeLib->GetTypeInfo(i, &m_typeInfo); } *ppvObjOut = m_typeInfo; return S_OK; } STDMETHODIMP CConnectionPoint::Advise(IUnknown *pUnk,DWORD *pdwCookie) { pUnk->QueryInterface(m_iid, (void **)&m_rgSinks); sprintf(aa,"CConnectionPoint::Advise pUnk %p m_rgSinks %p",pUnk,m_rgSinks); abc(aa); jmethodID toggleEventsListener = g_env->GetMethodID((jclass) m_jClass, "toggleEventsListeners", "(Z)V"); g_env->CallVoidMethod(m_jBean, toggleEventsListener,1); *pdwCookie = (DWORD)1; return 0; } STDMETHODIMP CDispatch::Invoke(DISPID dispid,REFIID riid,LCID lcid, WORD wFlags,DISPPARAMS *pdispparams,VARIANT *pvarResult,EXCEPINFO *pexcepinfo,UINT *puArgErr) { char aa[100]; sprintf(aa,"CDispatch::Invoke dispid %d flags %d",dispid,wFlags); abc(aa); long res=0; if (dispid < m_propertyNb) { if (wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF ) res = propertySet(dispid, pdispparams); else res = propertyGet(dispid, pvarResult); } else { DISPPARAMS *dispresult = (DISPPARAMS *) malloc(sizeof(DISPPARAMS)); dispresult->rgvarg = pvarResult; dispresult->cArgs = 1; m_jInvoke = g_env->GetMethodID((jclass) m_jClass,"invoke", "(III)I"); res=g_env->CallIntMethod(m_jBean,m_jInvoke,dispid,pdispparams,dispresult); } sprintf(aa,"CDispatch::Invoke res=%d",res); abc(aa); return res; } STDMETHODIMP CDispatch::propertyGet(DISPID dispid, VARIANT *pVarResult) { m_jPropertyGet = g_env->GetMethodID((jclass) m_jClass,"propertyGet", "(II)Z"); DISPPARAMS *dispresult = (DISPPARAMS *) malloc(sizeof(DISPPARAMS)); dispresult->rgvarg = pVarResult; dispresult->cArgs = 1; jboolean bool=g_env->CallBooleanMethod((jclass)m_jBean, m_jPropertyGet, dispid, dispresult); sprintf(aa,"CDispatch::propertyGet bool %d",bool); abc(aa); return (bool?S_OK:DISP_E_MEMBERNOTFOUND); } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IIZI (JNIEnv *env,jobject hListener,jint dispparams,jint index,jboolean value,jint flag) { abc("Java_sun_beans_ole_OleDispatchInterface_storeParm__IIZI"); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; ppData[index].vt = VT_BOOL; if (value) { sprintf(aa,"Java_sun_beans_ole_OleDispatchInterface_storeParm__IIZI 1 index %d",index); abc(aa); ppData[index].iVal=VARIANT_TRUE; } else { sprintf(aa,"Java_sun_beans_ole_OleDispatchInterface_storeParm__IIZI 2 index %d",index); abc(aa); ppData[index].iVal=VARIANT_FALSE; } } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IILjava_awt_Color_2I (JNIEnv * env,jobject hListener,jint dispparams,jint index,jobject jColor, jint flag) { sprintf(aa,"Java_sun_beans_ole_OleDispatchInterface_storeParm__IILjava_awt_Color_2I index %d",index); abc(aa); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; VARIANT *pVar=&ppData[index]; jmethodID methodID; jclass clazz = g_env->GetObjectClass(jColor); methodID = g_env->GetMethodID(clazz, "getRed","()I"); long r = g_env->CallIntMethod(jColor, methodID); methodID = g_env->GetMethodID(clazz, "getGreen","()I"); long g = g_env->CallIntMethod(jColor, methodID); methodID = g_env->GetMethodID(clazz, "getBlue","()I"); long b = g_env->CallIntMethod(jColor, methodID); COLORREF colorRef = RGB(r,g,b); pVar->vt = VT_COLOR; pVar->lVal = colorRef; } void copyJavaIntrinsicInVariant(jint dispparams, jint index, void *value, jint flag, int elemType, int elemSize) { int *i=(int *)value; sprintf(aa,"copyJavaIntrinsicInVariant index=%d elemSize=%d elemType=%d value=%d",index,elemSize,elemType,*i); abc(aa); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; VARIANT *pVar = &ppData[index]; pVar->vt = elemType; ppData[index].iVal = 0; memcpy(&pVar->iVal, value, elemSize); } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IIII (JNIEnv *env , jobject hListener, jint dispparams, jint index, jint value, jint flag) { abc("JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IIII"); copyJavaIntrinsicInVariant(dispparams,index,&value,flag,VT_I4,sizeof(int)); } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IILjava_awt_Font_2I (JNIEnv *env,jobject hListener,jint dispparams,jint index,jobject jFont,jint flag) { abc("Java_sun_beans_ole_OleDispatchInterface_storeParm__IILjava_awt_Font_2I"); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; VARIANT *pVar=&ppData[index]; jclass clazz = g_env->FindClass("java/awt/Font"); jfieldID italicID, boldID; boldID = g_env->GetStaticFieldID(clazz, "BOLD", "I"); italicID = g_env->GetStaticFieldID(clazz, "ITALIC", "I"); s_getName = g_env->GetMethodID(clazz, "getName", "()Ljava/lang/String;"); s_getSize = g_env->GetMethodID(clazz, "getSize", "()I"); s_getStyle = g_env->GetMethodID(clazz, "getStyle", "()I"); jstring javaString = (jstring) g_env->CallObjectMethod(jFont, s_getName); char * javaFontName = (char *) g_env->GetStringUTFChars(javaString, NULL); WCHAR * fontName=L"Arial"; fontDesc.cbSizeofstruct = sizeof(FONTDESC); fontDesc.lpstrName = fontName; fontDesc.cySize.Lo = g_env->CallIntMethod(jFont, s_getSize)*10000; int style = g_env->CallIntMethod(jFont, s_getStyle); fontDesc.sWeight = (style & 0)?FW_BOLD:FW_NORMAL; fontDesc.sCharset = ANSI_CHARSET; g_env->ReleaseStringUTFChars(javaString, javaFontName); IDispatch *pDispatch; OleCreateFontIndirect(&fontDesc, IID_IDispatch,(void **) &pDispatch); pVar->vt = VT_FONT; pVar->pdispVal = pDispatch; } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IIFI (JNIEnv *env, jobject hListener , jint dispparams, jint index , jfloat value , jint flag) { abc("JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IIFI"); copyJavaIntrinsicInVariant(dispparams,index,&value,flag,VT_R4,sizeof(float)); } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_storeParm__IILjava_lang_String_2I (JNIEnv *env, jobject hListener, jint dispparams, jint index, jstring value, jint flag) { abc("Java_sun_beans_ole_OleDispatchInterface_storeParm__IILjava_lang_String_2I"); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; VARIANT *pVar=&ppData[index]; LPWSTR pwsz = (LPWSTR) SysAllocStringLen(NULL, 10000); MultiByteToWideChar(CP_ACP, 0, " ", -1,pwsz , 10000); pVar->vt = VT_BSTR; pVar->bstrVal = pwsz; } JNIEXPORT jint JNICALL Java_sun_beans_ole_OleEventListener_allocateParmsFor (JNIEnv * env, jobject oleListener, jint size) { abc("Java_sun_beans_ole_OleEventListener_allocateParmsFor"); DISPPARAMS *dispparams = (DISPPARAMS *) malloc(sizeof(DISPPARAMS)); dispparams->rgvarg = (VARIANTARG *) malloc(sizeof(VARIANTARG) * size); dispparams->cArgs = size; return (long) dispparams; } JNIEXPORT void JNICALL Java_sun_beans_ole_OleDispatchInterface_nativeStoreParm (JNIEnv *env, jobject hListener, jint dispparams, jint index , jobject value , jint flag) { abc("Java_sun_beans_ole_OleDispatchInterface_nativeStoreParm"); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; CJavaObject jObject; jObject.storeInVariant(value, &ppData[index],flag == 1); } HRESULT CJavaObject::storeInVariant(jobject jObject, VARIANT *pVar, BOOL bReadOnly) { abc("CJavaObject::storeInVariant"); CJavaDispatch *proxy = new CJavaDispatch(); pVar->vt = VT_DISPATCH; proxy->QueryInterface(IID_IDispatch, (void **) &(pVar->pdispVal)); return S_OK; } HRESULT CJavaDispatch::QueryInterface(REFIID riid,void ** ppvObjOut) { abc("CJavaDispatch::QueryInterface IID_IDispatch"); *ppvObjOut = (IDispatch *) this; return S_OK; } JNIEXPORT void JNICALL Java_sun_beans_ole_OleEventListener_fireEvent (JNIEnv *, jobject, jint connectionPoint, jint dispid, jint dispparams) { abc("Java_sun_beans_ole_OleEventListener_fireEvent"); ((IDispatch *)m_rgSinks)->Invoke(dispid,IID_NULL, 0, DISPATCH_METHOD, (DISPPARAMS *)dispparams, NULL, NULL, NULL); } JNIEXPORT void JNICALL Java_sun_beans_ole_OleEventListener_freeParms (JNIEnv *env, jobject oleListener , jint dispparams){} STDMETHODIMP CDispatch::propertySet(DISPID dispid, DISPPARAMS *pVarValue) { abc("CDispatch 10 CDispatch::propertySet"); m_jPropertySet = g_env->GetMethodID((jclass)m_jClass,"propertySet","(II)Z"); boolean res = g_env->CallBooleanMethod((jclass)m_jBean, m_jPropertySet, dispid, pVarValue); return (res?S_OK:DISP_E_MEMBERNOTFOUND); } void copyVariantInJavaIntrinsic(jint dispparams, jint index, void * value,int elemType, int elemSize) { abc("JavaHelpers 2 copyVariantInJavaIntrinsic"); VARIANTARG *ppData = ((DISPPARAMS *) dispparams)->rgvarg; VariantChangeType(&ppData[index], &ppData[index], 0, VT_BYREF | elemType); VariantChangeType(&ppData[index], &ppData[index], 0, elemType); memcpy(value, &ppData[index].iVal, elemSize); } JNIEXPORT jint JNICALL Java_sun_beans_ole_OleDispatchInterface_intParm (JNIEnv *env, jobject hListener, jint dispparams, jint index) { abc("JavaHelpers 33 jint JNICALL Java_sun_beans_ole_OleDispatchInterface_intParm"); jint value=0; copyVariantInJavaIntrinsic(dispparams, index, &value,VT_I4, sizeof(jint)); return value; } STDMETHODIMP CPersist::GetClassID(CLSID *pclsid) { abc("CPersist::GetClassID"); *pclsid = m_rclsid; return S_OK; } STDMETHODIMP CPersist::Save(IStream *pStream, BOOL fClearDirty) { abc("CPersist CPersist::Save"); pStream->AddRef(); COleStream jStream(pStream); jobject javaOS = jStream.InitInstance(g_env, FALSE); jmethodID saveBean = g_env->GetMethodID((jclass) m_jClass, "saveBean", "(Ljava/io/OutputStream;)Z"); g_env->CallBooleanMethod(m_jBean, saveBean, javaOS); return 0; } jobject COleStream::InitInstance(JNIEnv * env, BOOL bRead) { abc("COleStream::InitInstance"); jclass clazz; if (bRead) { abc("COleStream::InitInstance 1"); clazz= env->FindClass("sun/beans/ole/OleInputStream"); } else { abc("COleStream::InitInstance 2"); clazz= env->FindClass("sun/beans/ole/OleOutputStream"); } jmethodID init = env->GetMethodID(clazz, "", "(II)V"); return env->NewObject(clazz, init, (int) this, (int) m_pIStream); } JNIEXPORT jint JNICALL Java_sun_beans_ole_OleOutputStream_write (JNIEnv *env, jobject sender , jint cOleOS, jint pIStream, jbyteArray bytes, jint offset, jint len) { abc("Java_sun_beans_ole_OleOutputStream_write"); COleStream * pOS = (COleStream *) cOleOS; return pOS->write(env, (IStream *) pIStream, bytes, offset, len); } HRESULT COleStream::write(JNIEnv *env, IStream *pIStream, jbyteArray byteArray, int offset, int length) { abc("COleStream::write"); signed char * bytes = env->GetByteArrayElements(byteArray,0); pIStream->Write( bytes + offset, length, NULL); env->ReleaseByteArrayElements(byteArray,bytes, JNI_ABORT); return 0; } JNIEXPORT void JNICALL Java_sun_beans_ole_OleOutputStream_detachThread (JNIEnv *env, jobject sender, jint iStream) {} STDMETHODIMP COleObject::Close( DWORD dwSaveOption) { abc("COleObject::Close"); jmethodID dispose = g_env->GetMethodID((jclass) m_jClass, "dispose", "()V"); g_env->CallVoidMethod(m_jBean, dispose); return S_OK; } STDMETHODIMP CPersist::Load(IStream *pStream) { abc("CPersist::Load 2"); COleStream inputStream(pStream); jobject javaIS = inputStream.InitInstance(g_env, TRUE); jmethodID loadBean = g_env->GetStaticMethodID((jclass) m_jClass,"loadBean", "(Ljava/lang/String;Ljava/lang/String;Ljava/io/InputStream;I)Ljava/lang/Object;"); jstring beanName = g_env->NewStringUTF(m_szClassName); jstring jarFileName = g_env->NewStringUTF(m_szJarFileName); jobject res = g_env->CallStaticObjectMethod((jclass) m_jClass, loadBean, jarFileName, beanName, javaIS, (long) 0); m_jBean = g_env->NewGlobalRef(res); m_jClass = g_env->NewGlobalRef(g_env->GetObjectClass(m_jBean)); initializeConnectionPointOn(); createControlWindow(); return S_OK; } JNIEXPORT jint JNICALL Java_sun_beans_ole_OleInputStream_available (JNIEnv *env, jobject sender, jint cOleStream, jint pIStream) { abc("COleStream Java_sun_beans_ole_OleInputStream_available"); COleStream * pOS = (COleStream *) cOleStream; return pOS->available((IStream *) pIStream); } int COleStream::available(IStream *pIStream) { abc("COleStream::available"); STATSTG stat; pIStream->Stat(&stat, STATFLAG_NONAME); ULARGE_INTEGER pointerPos; LARGE_INTEGER disp; ZeroMemory(&disp, sizeof(LARGE_INTEGER)); pIStream->Seek(disp,STREAM_SEEK_CUR, &pointerPos); return stat.cbSize.LowPart - pointerPos.LowPart; } JNIEXPORT jint JNICALL Java_sun_beans_ole_OleInputStream_read (JNIEnv *env , jobject sender, jint cOleStream, jint pIStream, jbyteArray bytes, jint off, jint len) { abc("COleStream Java_sun_beans_ole_OleInputStream_read"); COleStream * pOS = (COleStream *) cOleStream; return pOS->read(env, (IStream *) pIStream, bytes, off, len); } long COleStream::read(JNIEnv * env, IStream *pIStream, jbyteArray byteArray, int offset, int len) { abc("COleStream::read"); ULONG byteRead; signed char * bytes = env->GetByteArrayElements(byteArray,0); pIStream->Read(bytes + offset, len, &byteRead); env->ReleaseByteArrayElements(byteArray, bytes, JNI_COMMIT); return byteRead; } JNIEXPORT void JNICALL Java_sun_beans_ole_OleInputStream_detachThread(JNIEnv *env, jobject sender, jint iStream) {} STDMETHODIMP COleObject::DoVerb(LONG lVerb,LPMSG pMsg, IOleClientSite *pActiveSite,LONG lIndex,HWND hwndParent,LPCRECT prcPosRect) { abc("COleObject::DoVerb"); return m_pCOleInPlace->InPlaceActivate(pActiveSite, FALSE); } HRESULT COleInPlace::InPlaceActivate(IOleClientSite *pOleClientSite, BOOL fIncludeUI) { OLEINPLACEFRAMEINFO InPlaceFrameInfo; RECT rcPos, rcClip;HWND hWndParent; abc("COleInPlace::InPlaceActivate"); pOleClientSite->QueryInterface(IID_IOleInPlaceSite, (void **) &m_pInPlaceSite); m_pInPlaceSite->CanInPlaceActivate(); m_pInPlaceSite->OnInPlaceActivate(); InPlaceFrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO); m_pInPlaceSite->GetWindow(&hWndParent); m_pInPlaceSite->GetWindowContext(&m_pInPlaceFrame, &m_pInPlaceUIWindow, &rcPos, &rcClip, &InPlaceFrameInfo); SetWindowLong(m_hWnd, GWL_STYLE, (WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)); ::SetParent(m_hWnd, hWndParent); ShowWindow(m_hWnd, SW_SHOW); RECT *prcPos=&rcPos;RECT *prcClip=&rcClip;int cx, cy;RECT rcIXect; IntersectRect(&rcIXect, prcPos, prcClip); cx = prcPos->right - prcPos->left; cy = prcPos->bottom - prcPos->top; SetWindowPos(m_hWnd, NULL, prcPos->left,prcPos->top, cx, cy, 0 ); jmethodID setSize = g_env->GetMethodID((jclass)m_jClass, "setSize", "(II)V"); g_env->CallVoidMethod(m_jBean,setSize,cx,cy); return NOERROR; }