diff --git a/dlls/oleaut32/oleaut.c b/dlls/oleaut32/oleaut.c index 87616d7b9c1..a676c7f1356 100644 --- a/dlls/oleaut32/oleaut.c +++ b/dlls/oleaut32/oleaut.c @@ -507,6 +507,7 @@ HRESULT WINAPI OLEAUT32_DllUnregisterServer() { } extern void _get_STDFONT_CF(LPVOID); +extern void _get_STDPIC_CF(LPVOID); /*********************************************************************** * DllGetClassObject (OLEAUT32.1) @@ -521,6 +522,13 @@ HRESULT WINAPI OLEAUT32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *pp return S_OK; } } + if (IsEqualGUID(rclsid,&CLSID_StdPicture)) { + if (IsEqualGUID(iid,&IID_IClassFactory)) { + _get_STDPIC_CF(ppv); + IClassFactory_AddRef((IClassFactory*)*ppv); + return S_OK; + } + } if (IsEqualGUID(rclsid,&CLSID_PSOAInterface)) { if (S_OK==TypeLibFac_DllGetClassObject(rclsid,iid,ppv)) return S_OK; diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index b320d3af5cf..480375d3c9e 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -219,6 +219,11 @@ static OLEPictureImpl* OLEPictureImpl_Construct(LPPICTDESC pictDesc, BOOL fOwn) newObject->himetricHeight = pictDesc->u.wmf.yExt; break; + case PICTYPE_NONE: + /* not sure what to do here */ + newObject->himetricWidth = newObject->himetricHeight = 0; + break; + case PICTYPE_ICON: case PICTYPE_ENHMETAFILE: default: @@ -997,6 +1002,8 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) { } else { This->desc.picType = PICTYPE_ICON; This->desc.u.icon.hicon = hicon; + This->himetricWidth = cifd->idEntries[i].bWidth; + This->himetricHeight = cifd->idEntries[i].bHeight; hr = S_OK; } break; @@ -1308,3 +1315,63 @@ HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, IPicture_Release(newpic); return hr; } + +/******************************************************************************* + * StdPic ClassFactory + */ +typedef struct +{ + /* IUnknown fields */ + ICOM_VFIELD(IClassFactory); + DWORD ref; +} IClassFactoryImpl; + +static HRESULT WINAPI +SPCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { + ICOM_THIS(IClassFactoryImpl,iface); + + FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI +SPCF_AddRef(LPCLASSFACTORY iface) { + ICOM_THIS(IClassFactoryImpl,iface); + return ++(This->ref); +} + +static ULONG WINAPI SPCF_Release(LPCLASSFACTORY iface) { + ICOM_THIS(IClassFactoryImpl,iface); + /* static class, won't be freed */ + return --(This->ref); +} + +static HRESULT WINAPI SPCF_CreateInstance( + LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj +) { + PICTDESC pd; + + FIXME("(%p,%p,%s,%p), creating stdpic with PICTYPE_NONE.\n",iface,pOuter,debugstr_guid(riid),ppobj); + pd.cbSizeofstruct = sizeof(pd); + pd.picType = PICTYPE_NONE; + return OleCreatePictureIndirect(&pd,riid,TRUE,ppobj); + +} + +static HRESULT WINAPI SPCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { + ICOM_THIS(IClassFactoryImpl,iface); + FIXME("(%p)->(%d),stub!\n",This,dolock); + return S_OK; +} + +static ICOM_VTABLE(IClassFactory) SPCF_Vtbl = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + SPCF_QueryInterface, + SPCF_AddRef, + SPCF_Release, + SPCF_CreateInstance, + SPCF_LockServer +}; +static IClassFactoryImpl STDPIC_CF = {&SPCF_Vtbl, 1 }; + +void _get_STDPIC_CF(LPVOID *ppv) { *ppv = (LPVOID)&STDPIC_CF; }