atl100: Added AtlGetObjectSourceInterface implementation.

This commit is contained in:
Jacek Caban 2013-01-15 12:45:47 +01:00 committed by Alexandre Julliard
parent 0b10f0b854
commit 852a42e275
5 changed files with 115 additions and 3 deletions

View File

@ -45,7 +45,7 @@
51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save 51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save
52 stub AtlIPersistPropertyBag_Load 52 stub AtlIPersistPropertyBag_Load
53 stub AtlIPersistPropertyBag_Save 53 stub AtlIPersistPropertyBag_Save
54 stub AtlGetObjectSourceInterface 54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr) atl100.AtlGetObjectSourceInterface
55 stub AtlModuleUnRegisterTypeLib 55 stub AtlModuleUnRegisterTypeLib
56 stdcall AtlModuleLoadTypeLib(ptr wstr ptr ptr) 56 stdcall AtlModuleLoadTypeLib(ptr wstr ptr ptr)
57 stdcall AtlModuleUnregisterServerEx(ptr long ptr) 57 stdcall AtlModuleUnregisterServerEx(ptr long ptr)

View File

@ -595,6 +595,117 @@ BOOL WINAPI AtlWaitWithMessageLoop(HANDLE handle)
} }
} }
static HRESULT get_default_source(ITypeLib *typelib, const CLSID *clsid, IID *iid)
{
ITypeInfo *typeinfo, *src_typeinfo = NULL;
TYPEATTR *attr;
int type_flags;
unsigned i;
HRESULT hres;
hres = ITypeLib_GetTypeInfoOfGuid(typelib, clsid, &typeinfo);
if(FAILED(hres))
return hres;
hres = ITypeInfo_GetTypeAttr(typeinfo, &attr);
if(FAILED(hres)) {
ITypeInfo_Release(typeinfo);
return hres;
}
for(i=0; i < attr->cImplTypes; i++) {
hres = ITypeInfo_GetImplTypeFlags(typeinfo, i, &type_flags);
if(SUCCEEDED(hres) && type_flags == (IMPLTYPEFLAG_FSOURCE|IMPLTYPEFLAG_FDEFAULT)) {
HREFTYPE ref;
hres = ITypeInfo_GetRefTypeOfImplType(typeinfo, i, &ref);
if(SUCCEEDED(hres))
hres = ITypeInfo_GetRefTypeInfo(typeinfo, ref, &src_typeinfo);
break;
}
}
ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
ITypeInfo_Release(typeinfo);
if(FAILED(hres))
return hres;
if(!src_typeinfo) {
*iid = IID_NULL;
return S_OK;
}
hres = ITypeInfo_GetTypeAttr(src_typeinfo, &attr);
if(SUCCEEDED(hres)) {
*iid = attr->guid;
ITypeInfo_ReleaseTypeAttr(src_typeinfo, attr);
}
ITypeInfo_Release(src_typeinfo);
return hres;
}
/***********************************************************************
* AtlGetObjectSourceInterface [atl100.54]
*/
HRESULT WINAPI AtlGetObjectSourceInterface(IUnknown *unk, GUID *libid, IID *iid, unsigned short *major, unsigned short *minor)
{
IProvideClassInfo2 *classinfo;
ITypeInfo *typeinfo;
ITypeLib *typelib;
IPersist *persist;
IDispatch *disp;
HRESULT hres;
TRACE("(%p %p %p %p %p)\n", unk, libid, iid, major, minor);
hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp);
if(FAILED(hres))
return hres;
hres = IDispatch_GetTypeInfo(disp, 0, 0, &typeinfo);
IDispatch_Release(disp);
if(FAILED(hres))
return hres;
hres = ITypeInfo_GetContainingTypeLib(typeinfo, &typelib, 0);
ITypeInfo_Release(typeinfo);
if(SUCCEEDED(hres)) {
TLIBATTR *attr;
hres = ITypeLib_GetLibAttr(typelib, &attr);
if(SUCCEEDED(hres)) {
*libid = attr->guid;
*major = attr->wMajorVerNum;
*minor = attr->wMinorVerNum;
ITypeLib_ReleaseTLibAttr(typelib, attr);
}else {
ITypeLib_Release(typelib);
}
}
if(FAILED(hres))
return hres;
hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&classinfo);
if(SUCCEEDED(hres)) {
hres = IProvideClassInfo2_GetGUID(classinfo, GUIDKIND_DEFAULT_SOURCE_DISP_IID, iid);
IProvideClassInfo2_Release(classinfo);
ITypeLib_Release(typelib);
return hres;
}
hres = IUnknown_QueryInterface(unk, &IID_IPersist, (void**)&persist);
if(SUCCEEDED(hres)) {
CLSID clsid;
hres = IPersist_GetClassID(persist, &clsid);
if(SUCCEEDED(hres))
hres = get_default_source(typelib, &clsid, iid);
IPersist_Release(persist);
}
return hres;
}
/*********************************************************************** /***********************************************************************
* AtlGetVersion [atl100.@] * AtlGetVersion [atl100.@]
*/ */

View File

@ -37,7 +37,7 @@
51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) 51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr)
52 stub AtlIPersistPropertyBag_Load 52 stub AtlIPersistPropertyBag_Load
53 stub AtlIPersistPropertyBag_Save 53 stub AtlIPersistPropertyBag_Save
54 stub AtlGetObjectSourceInterface 54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr)
56 stdcall AtlLoadTypeLib(long wstr ptr ptr) 56 stdcall AtlLoadTypeLib(long wstr ptr ptr)
58 stdcall AtlModuleAddTermFunc(ptr ptr long) 58 stdcall AtlModuleAddTermFunc(ptr ptr long)
59 stub AtlAxCreateControlLic 59 stub AtlAxCreateControlLic

View File

@ -39,7 +39,7 @@
51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save 51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save
52 stub AtlIPersistPropertyBag_Load 52 stub AtlIPersistPropertyBag_Load
53 stub AtlIPersistPropertyBag_Save 53 stub AtlIPersistPropertyBag_Save
54 stub AtlGetObjectSourceInterface 54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr) atl100.AtlGetObjectSourceInterface
55 stub AtlUnRegisterTypeLib 55 stub AtlUnRegisterTypeLib
56 stdcall AtlLoadTypeLib(long wstr ptr ptr) atl100.AtlLoadTypeLib 56 stdcall AtlLoadTypeLib(long wstr ptr ptr) atl100.AtlLoadTypeLib
58 stdcall AtlModuleAddTermFunc(ptr ptr long) atl100.AtlModuleAddTermFunc 58 stdcall AtlModuleAddTermFunc(ptr ptr long) atl100.AtlModuleAddTermFunc

View File

@ -257,5 +257,6 @@ HRESULT WINAPI AtlRegisterClassCategoriesHelper(REFCLSID,const struct _ATL_CATMA
HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE*,REFCLSID,REFIID,void**); HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE*,REFCLSID,REFIID,void**);
HRESULT WINAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE*,BOOL,const CLSID*); HRESULT WINAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE*,BOOL,const CLSID*);
BOOL WINAPI AtlWaitWithMessageLoop(HANDLE); BOOL WINAPI AtlWaitWithMessageLoop(HANDLE);
HRESULT WINAPI AtlGetObjectSourceInterface(IUnknown*,GUID*,IID*,unsigned short*,unsigned short*);
#endif /* __WINE_ATLBASE_H__ */ #endif /* __WINE_ATLBASE_H__ */