- Sync to Wine 1.3.37

svn path=/trunk/; revision=56159
This commit is contained in:
Rafal Harabien 2012-03-15 20:17:15 +00:00
parent 4ae01ae604
commit a339649110
4 changed files with 256 additions and 122 deletions

View file

@ -41,11 +41,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(atl); WINE_DEFAULT_DEBUG_CHANNEL(atl);
typedef struct IOCS { typedef struct IOCS {
const IOleClientSiteVtbl *lpOleClientSiteVtbl; IOleClientSite IOleClientSite_iface;
const IOleContainerVtbl *lpOleContainerVtbl; IOleContainer IOleContainer_iface;
const IOleInPlaceSiteWindowlessVtbl *lpOleInPlaceSiteWindowlessVtbl; IOleInPlaceSiteWindowless IOleInPlaceSiteWindowless_iface;
const IOleInPlaceFrameVtbl *lpOleInPlaceFrameVtbl; IOleInPlaceFrame IOleInPlaceFrame_iface;
const IOleControlSiteVtbl *lpOleControlSiteVtbl; IOleControlSite IOleControlSite_iface;
LONG ref; LONG ref;
HWND hWnd; HWND hWnd;
@ -126,12 +126,6 @@ static ULONG IOCS_AddRef(IOCS *This)
return ref; return ref;
} }
#define THIS2IOLECLIENTSITE(This) ((IOleClientSite*)&(This)->lpOleClientSiteVtbl)
#define THIS2IOLECONTAINER(This) (&(This)->lpOleContainerVtbl)
#define THIS2IOLEINPLACESITEWINDOWLESS(This) (&(This)->lpOleInPlaceSiteWindowlessVtbl)
#define THIS2IOLEINPLACEFRAME(This) (&(This)->lpOleInPlaceFrameVtbl)
#define THIS2IOLECONTROLSITE(This) (&(This)->lpOleControlSiteVtbl)
static HRESULT IOCS_QueryInterface(IOCS *This, REFIID riid, void **ppv) static HRESULT IOCS_QueryInterface(IOCS *This, REFIID riid, void **ppv)
{ {
*ppv = NULL; *ppv = NULL;
@ -139,19 +133,19 @@ static HRESULT IOCS_QueryInterface(IOCS *This, REFIID riid, void **ppv)
if ( IsEqualIID( &IID_IUnknown, riid ) if ( IsEqualIID( &IID_IUnknown, riid )
|| IsEqualIID( &IID_IOleClientSite, riid ) ) || IsEqualIID( &IID_IOleClientSite, riid ) )
{ {
*ppv = THIS2IOLECLIENTSITE(This); *ppv = &This->IOleClientSite_iface;
} else if ( IsEqualIID( &IID_IOleContainer, riid ) ) } else if ( IsEqualIID( &IID_IOleContainer, riid ) )
{ {
*ppv = THIS2IOLECONTAINER(This); *ppv = &This->IOleContainer_iface;
} else if ( IsEqualIID( &IID_IOleInPlaceSite, riid ) || IsEqualIID( &IID_IOleInPlaceSiteEx, riid ) || IsEqualIID( &IID_IOleInPlaceSiteWindowless, riid ) ) } else if ( IsEqualIID( &IID_IOleInPlaceSite, riid ) || IsEqualIID( &IID_IOleInPlaceSiteEx, riid ) || IsEqualIID( &IID_IOleInPlaceSiteWindowless, riid ) )
{ {
*ppv = THIS2IOLEINPLACESITEWINDOWLESS(This); *ppv = &This->IOleInPlaceSiteWindowless_iface;
} else if ( IsEqualIID( &IID_IOleInPlaceFrame, riid ) ) } else if ( IsEqualIID( &IID_IOleInPlaceFrame, riid ) )
{ {
*ppv = THIS2IOLEINPLACEFRAME(This); *ppv = &This->IOleInPlaceFrame_iface;
} else if ( IsEqualIID( &IID_IOleControlSite, riid ) ) } else if ( IsEqualIID( &IID_IOleControlSite, riid ) )
{ {
*ppv = THIS2IOLECONTROLSITE(This); *ppv = &This->IOleControlSite_iface;
} }
if (*ppv) if (*ppv)
@ -181,154 +175,181 @@ static ULONG IOCS_Release(IOCS *This)
return ref; return ref;
} }
#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
/****** IOleClientSite *****/ /****** IOleClientSite *****/
#undef IFACE2THIS static inline IOCS *impl_from_IOleClientSite(IOleClientSite *iface)
#define IFACE2THIS(iface) DEFINE_THIS(IOCS,OleClientSite, iface) {
return CONTAINING_RECORD(iface, IOCS, IOleClientSite_iface);
}
static HRESULT WINAPI OleClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv) static HRESULT WINAPI OleClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
return IOCS_QueryInterface(This, riid, ppv); return IOCS_QueryInterface(This, riid, ppv);
} }
static ULONG WINAPI OleClientSite_AddRef(IOleClientSite *iface) static ULONG WINAPI OleClientSite_AddRef(IOleClientSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
return IOCS_AddRef(This); return IOCS_AddRef(This);
} }
static ULONG WINAPI OleClientSite_Release(IOleClientSite *iface) static ULONG WINAPI OleClientSite_Release(IOleClientSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
return IOCS_Release(This); return IOCS_Release(This);
} }
static HRESULT WINAPI OleClientSite_SaveObject(IOleClientSite *iface) static HRESULT WINAPI OleClientSite_SaveObject(IOleClientSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
FIXME( "(%p) - stub\n", This ); FIXME( "(%p) - stub\n", This );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) static HRESULT WINAPI OleClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
FIXME( "(%p, 0x%x, 0x%x, %p)\n", This, dwAssign, dwWhichMoniker, ppmk ); FIXME( "(%p, 0x%x, 0x%x, %p)\n", This, dwAssign, dwWhichMoniker, ppmk );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer) static HRESULT WINAPI OleClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
TRACE( "(%p, %p)\n", This, ppContainer ); TRACE( "(%p, %p)\n", This, ppContainer );
return OleClientSite_QueryInterface( iface, &IID_IOleContainer, (void**)ppContainer ); return OleClientSite_QueryInterface( iface, &IID_IOleContainer, (void**)ppContainer );
} }
static HRESULT WINAPI OleClientSite_ShowObject(IOleClientSite *iface) static HRESULT WINAPI OleClientSite_ShowObject(IOleClientSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
FIXME( "(%p) - stub\n", This ); FIXME( "(%p) - stub\n", This );
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow) static HRESULT WINAPI OleClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
FIXME( "(%p, %s) - stub\n", This, fShow ? "TRUE" : "FALSE" ); FIXME( "(%p, %s) - stub\n", This, fShow ? "TRUE" : "FALSE" );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleClientSite_RequestNewObjectLayout(IOleClientSite *iface) static HRESULT WINAPI OleClientSite_RequestNewObjectLayout(IOleClientSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleClientSite(iface);
FIXME( "(%p) - stub\n", This ); FIXME( "(%p) - stub\n", This );
return E_NOTIMPL; return E_NOTIMPL;
} }
#undef IFACE2THIS
/****** IOleContainer *****/ /****** IOleContainer *****/
#define IFACE2THIS(iface) DEFINE_THIS(IOCS, OleContainer, iface) static inline IOCS *impl_from_IOleContainer(IOleContainer *iface)
{
return CONTAINING_RECORD(iface, IOCS, IOleContainer_iface);
}
static HRESULT WINAPI OleContainer_QueryInterface( IOleContainer* iface, REFIID riid, void** ppv) static HRESULT WINAPI OleContainer_QueryInterface( IOleContainer* iface, REFIID riid, void** ppv)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleContainer(iface);
return IOCS_QueryInterface( This, riid, ppv ); return IOCS_QueryInterface( This, riid, ppv );
} }
static ULONG WINAPI OleContainer_AddRef(IOleContainer* iface) static ULONG WINAPI OleContainer_AddRef(IOleContainer* iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleContainer(iface);
return IOCS_AddRef(This); return IOCS_AddRef(This);
} }
static ULONG WINAPI OleContainer_Release(IOleContainer* iface) static ULONG WINAPI OleContainer_Release(IOleContainer* iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleContainer(iface);
return IOCS_Release(This); return IOCS_Release(This);
} }
static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer* iface, IBindCtx* pbc, static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer* iface, IBindCtx* pbc,
LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut) LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleContainer(iface);
FIXME( "(%p,%p,%s,%p,%p) - stub\n", This, pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut ); FIXME( "(%p,%p,%s,%p,%p) - stub\n", This, pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer* iface, DWORD grfFlags, IEnumUnknown** ppenum) static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer* iface, DWORD grfFlags, IEnumUnknown** ppenum)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleContainer(iface);
FIXME( "(%p, %u, %p) - stub\n", This, grfFlags, ppenum ); FIXME( "(%p, %u, %p) - stub\n", This, grfFlags, ppenum );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleContainer_LockContainer(IOleContainer* iface, BOOL fLock) static HRESULT WINAPI OleContainer_LockContainer(IOleContainer* iface, BOOL fLock)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleContainer(iface);
FIXME( "(%p, %s) - stub\n", This, fLock?"TRUE":"FALSE" ); FIXME( "(%p, %s) - stub\n", This, fLock?"TRUE":"FALSE" );
return E_NOTIMPL; return E_NOTIMPL;
} }
#undef IFACE2THIS
/****** IOleInPlaceSiteWindowless *******/ /****** IOleInPlaceSiteWindowless *******/
#define IFACE2THIS(iface) DEFINE_THIS(IOCS, OleInPlaceSiteWindowless, iface) static inline IOCS *impl_from_IOleInPlaceSiteWindowless(IOleInPlaceSiteWindowless *iface)
{
return CONTAINING_RECORD(iface, IOCS, IOleInPlaceSiteWindowless_iface);
}
static HRESULT WINAPI OleInPlaceSiteWindowless_QueryInterface(IOleInPlaceSiteWindowless *iface, REFIID riid, void **ppv) static HRESULT WINAPI OleInPlaceSiteWindowless_QueryInterface(IOleInPlaceSiteWindowless *iface, REFIID riid, void **ppv)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
return IOCS_QueryInterface(This, riid, ppv); return IOCS_QueryInterface(This, riid, ppv);
} }
static ULONG WINAPI OleInPlaceSiteWindowless_AddRef(IOleInPlaceSiteWindowless *iface) static ULONG WINAPI OleInPlaceSiteWindowless_AddRef(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
return IOCS_AddRef(This); return IOCS_AddRef(This);
} }
static ULONG WINAPI OleInPlaceSiteWindowless_Release(IOleInPlaceSiteWindowless *iface) static ULONG WINAPI OleInPlaceSiteWindowless_Release(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
return IOCS_Release(This); return IOCS_Release(This);
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_GetWindow(IOleInPlaceSiteWindowless* iface, HWND* phwnd) static HRESULT WINAPI OleInPlaceSiteWindowless_GetWindow(IOleInPlaceSiteWindowless* iface, HWND* phwnd)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("(%p,%p)\n", This, phwnd); TRACE("(%p,%p)\n", This, phwnd);
*phwnd = This->hWnd; *phwnd = This->hWnd;
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_ContextSensitiveHelp(IOleInPlaceSiteWindowless* iface, BOOL fEnterMode) static HRESULT WINAPI OleInPlaceSiteWindowless_ContextSensitiveHelp(IOleInPlaceSiteWindowless* iface, BOOL fEnterMode)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
FIXME("(%p,%d) - stub\n", This, fEnterMode); FIXME("(%p,%d) - stub\n", This, fEnterMode);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_CanInPlaceActivate(IOleInPlaceSiteWindowless *iface) static HRESULT WINAPI OleInPlaceSiteWindowless_CanInPlaceActivate(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceActivate(IOleInPlaceSiteWindowless *iface) static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceActivate(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
This->fInPlace = TRUE; This->fInPlace = TRUE;
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnUIActivate(IOleInPlaceSiteWindowless *iface) static HRESULT WINAPI OleInPlaceSiteWindowless_OnUIActivate(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
@ -338,7 +359,7 @@ static HRESULT WINAPI OleInPlaceSiteWindowless_GetWindowContext(IOleInPlaceSiteW
IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("(%p,%p,%p,%p,%p,%p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, lpFrameInfo); TRACE("(%p,%p,%p,%p,%p,%p)\n", This, ppFrame, ppDoc, lprcPosRect, lprcClipRect, lpFrameInfo);
@ -365,48 +386,55 @@ static HRESULT WINAPI OleInPlaceSiteWindowless_GetWindowContext(IOleInPlaceSiteW
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_Scroll(IOleInPlaceSiteWindowless *iface, SIZE scrollExtent) static HRESULT WINAPI OleInPlaceSiteWindowless_Scroll(IOleInPlaceSiteWindowless *iface, SIZE scrollExtent)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
FIXME("(%p) - stub\n", This); FIXME("(%p) - stub\n", This);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnUIDeactivate(IOleInPlaceSiteWindowless *iface, BOOL fUndoable) static HRESULT WINAPI OleInPlaceSiteWindowless_OnUIDeactivate(IOleInPlaceSiteWindowless *iface, BOOL fUndoable)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
FIXME("(%p,%d) - stub\n", This, fUndoable); FIXME("(%p,%d) - stub\n", This, fUndoable);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceDeactivate(IOleInPlaceSiteWindowless *iface) static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceDeactivate(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
This->fInPlace = This->fWindowless = FALSE; This->fInPlace = This->fWindowless = FALSE;
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_DiscardUndoState(IOleInPlaceSiteWindowless *iface) static HRESULT WINAPI OleInPlaceSiteWindowless_DiscardUndoState(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
FIXME("(%p) - stub\n", This); FIXME("(%p) - stub\n", This);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_DeactivateAndUndo(IOleInPlaceSiteWindowless *iface) static HRESULT WINAPI OleInPlaceSiteWindowless_DeactivateAndUndo(IOleInPlaceSiteWindowless *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
FIXME("(%p) - stub\n", This); FIXME("(%p) - stub\n", This);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnPosRectChange(IOleInPlaceSiteWindowless *iface, LPCRECT lprcPosRect) static HRESULT WINAPI OleInPlaceSiteWindowless_OnPosRectChange(IOleInPlaceSiteWindowless *iface, LPCRECT lprcPosRect)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
FIXME("(%p,%p) - stub\n", This, lprcPosRect); FIXME("(%p,%p) - stub\n", This, lprcPosRect);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceActivateEx( IOleInPlaceSiteWindowless *iface, BOOL* pfNoRedraw, DWORD dwFlags) static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceActivateEx( IOleInPlaceSiteWindowless *iface, BOOL* pfNoRedraw, DWORD dwFlags)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("\n"); TRACE("\n");
@ -415,9 +443,10 @@ static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceActivateEx( IOleInPlaceS
This->fWindowless = TRUE; This->fWindowless = TRUE;
return S_OK; return S_OK;
} }
static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceDeactivateEx( IOleInPlaceSiteWindowless *iface, BOOL fNoRedraw) static HRESULT WINAPI OleInPlaceSiteWindowless_OnInPlaceDeactivateEx( IOleInPlaceSiteWindowless *iface, BOOL fNoRedraw)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceSiteWindowless(iface);
TRACE("\n"); TRACE("\n");
@ -489,29 +518,35 @@ static HRESULT WINAPI OleInPlaceSiteWindowless_OnDefWindowMessage( IOleInPlaceSi
FIXME("\n"); FIXME("\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
#undef IFACE2THIS
/****** IOleInPlaceFrame *******/ /****** IOleInPlaceFrame *******/
#define IFACE2THIS(iface) DEFINE_THIS(IOCS, OleInPlaceFrame, iface) static inline IOCS *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface)
{
return CONTAINING_RECORD(iface, IOCS, IOleInPlaceFrame_iface);
}
static HRESULT WINAPI OleInPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv) static HRESULT WINAPI OleInPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
return IOCS_QueryInterface(This, riid, ppv); return IOCS_QueryInterface(This, riid, ppv);
} }
static ULONG WINAPI OleInPlaceFrame_AddRef(IOleInPlaceFrame *iface) static ULONG WINAPI OleInPlaceFrame_AddRef(IOleInPlaceFrame *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
return IOCS_AddRef(This); return IOCS_AddRef(This);
} }
static ULONG WINAPI OleInPlaceFrame_Release(IOleInPlaceFrame *iface) static ULONG WINAPI OleInPlaceFrame_Release(IOleInPlaceFrame *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
return IOCS_Release(This); return IOCS_Release(This);
} }
static HRESULT WINAPI OleInPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phWnd) static HRESULT WINAPI OleInPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phWnd)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
TRACE( "(%p,%p)\n", This, phWnd ); TRACE( "(%p,%p)\n", This, phWnd );
@ -521,7 +556,7 @@ static HRESULT WINAPI OleInPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *p
static HRESULT WINAPI OleInPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode) static HRESULT WINAPI OleInPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%d) - stub\n", This, fEnterMode ); FIXME( "(%p,%d) - stub\n", This, fEnterMode );
return E_NOTIMPL; return E_NOTIMPL;
@ -529,7 +564,7 @@ static HRESULT WINAPI OleInPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *ifa
static HRESULT WINAPI OleInPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder) static HRESULT WINAPI OleInPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%p) - stub\n", This, lprectBorder ); FIXME( "(%p,%p) - stub\n", This, lprectBorder );
return E_NOTIMPL; return E_NOTIMPL;
@ -537,7 +572,7 @@ static HRESULT WINAPI OleInPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT
static HRESULT WINAPI OleInPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths) static HRESULT WINAPI OleInPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%p) - stub\n", This, pborderwidths ); FIXME( "(%p,%p) - stub\n", This, pborderwidths );
return E_NOTIMPL; return E_NOTIMPL;
@ -545,7 +580,7 @@ static HRESULT WINAPI OleInPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface
static HRESULT WINAPI OleInPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths) static HRESULT WINAPI OleInPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%p) - stub\n", This, pborderwidths ); FIXME( "(%p,%p) - stub\n", This, pborderwidths );
return E_NOTIMPL; return E_NOTIMPL;
@ -553,7 +588,7 @@ static HRESULT WINAPI OleInPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface, LP
static HRESULT WINAPI OleInPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) static HRESULT WINAPI OleInPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%p,%s) - stub\n", This, pActiveObject, debugstr_w(pszObjName) ); FIXME( "(%p,%p,%s) - stub\n", This, pActiveObject, debugstr_w(pszObjName) );
return S_OK; return S_OK;
@ -561,7 +596,7 @@ static HRESULT WINAPI OleInPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface, I
static HRESULT WINAPI OleInPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) static HRESULT WINAPI OleInPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%p,%p) - stub\n", This, hmenuShared, lpMenuWidths ); FIXME( "(%p,%p,%p) - stub\n", This, hmenuShared, lpMenuWidths );
return E_NOTIMPL; return E_NOTIMPL;
@ -569,14 +604,15 @@ static HRESULT WINAPI OleInPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU
static HRESULT WINAPI OleInPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject) static HRESULT WINAPI OleInPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p,%p,%p,%p) - stub\n", This, hmenuShared, holemenu, hwndActiveObject ); FIXME( "(%p,%p,%p,%p) - stub\n", This, hmenuShared, holemenu, hwndActiveObject );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI OleInPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared) static HRESULT WINAPI OleInPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p, %p) - stub\n", This, hmenuShared ); FIXME( "(%p, %p) - stub\n", This, hmenuShared );
return E_NOTIMPL; return E_NOTIMPL;
@ -584,7 +620,7 @@ static HRESULT WINAPI OleInPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU
static HRESULT WINAPI OleInPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText) static HRESULT WINAPI OleInPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p, %s) - stub\n", This, debugstr_w( pszStatusText ) ); FIXME( "(%p, %s) - stub\n", This, debugstr_w( pszStatusText ) );
return E_NOTIMPL; return E_NOTIMPL;
@ -592,7 +628,7 @@ static HRESULT WINAPI OleInPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPC
static HRESULT WINAPI OleInPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable) static HRESULT WINAPI OleInPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p, %d) - stub\n", This, fEnable ); FIXME( "(%p, %d) - stub\n", This, fEnable );
return E_NOTIMPL; return E_NOTIMPL;
@ -600,31 +636,37 @@ static HRESULT WINAPI OleInPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BO
static HRESULT WINAPI OleInPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID) static HRESULT WINAPI OleInPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleInPlaceFrame(iface);
FIXME( "(%p, %p, %x) - stub\n", This, lpmsg, wID ); FIXME( "(%p, %p, %x) - stub\n", This, lpmsg, wID );
return E_NOTIMPL; return E_NOTIMPL;
} }
#undef IFACE2THIS
/****** IOleControlSite *******/ /****** IOleControlSite *******/
#define IFACE2THIS(iface) DEFINE_THIS(IOCS, OleControlSite, iface) static inline IOCS *impl_from_IOleControlSite(IOleControlSite *iface)
{
return CONTAINING_RECORD(iface, IOCS, IOleControlSite_iface);
}
static HRESULT WINAPI OleControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv) static HRESULT WINAPI OleControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleControlSite(iface);
return IOCS_QueryInterface(This, riid, ppv); return IOCS_QueryInterface(This, riid, ppv);
} }
static ULONG WINAPI OleControlSite_AddRef(IOleControlSite *iface) static ULONG WINAPI OleControlSite_AddRef(IOleControlSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleControlSite(iface);
return IOCS_AddRef(This); return IOCS_AddRef(This);
} }
static ULONG WINAPI OleControlSite_Release(IOleControlSite *iface) static ULONG WINAPI OleControlSite_Release(IOleControlSite *iface)
{ {
IOCS *This = IFACE2THIS(iface); IOCS *This = impl_from_IOleControlSite(iface);
return IOCS_Release(This); return IOCS_Release(This);
} }
static HRESULT WINAPI OleControlSite_OnControlInfoChanged( IOleControlSite* This) static HRESULT WINAPI OleControlSite_OnControlInfoChanged( IOleControlSite* This)
{ {
FIXME( "\n" ); FIXME( "\n" );
@ -660,8 +702,6 @@ static HRESULT WINAPI OleControlSite_ShowPropertyFrame( IOleControlSite* This)
FIXME( "\n" ); FIXME( "\n" );
return E_NOTIMPL; return E_NOTIMPL;
} }
#undef IFACE2THIS
static const IOleClientSiteVtbl OleClientSite_vtbl = { static const IOleClientSiteVtbl OleClientSite_vtbl = {
@ -860,7 +900,7 @@ static HRESULT IOCS_Attach( IOCS *This, HWND hWnd, IUnknown *pUnkControl ) /* su
{ {
This->hWnd = hWnd; This->hWnd = hWnd;
IUnknown_QueryInterface( pUnkControl, &IID_IOleObject, (void**)&This->control ); IUnknown_QueryInterface( pUnkControl, &IID_IOleObject, (void**)&This->control );
IOleObject_SetClientSite( This->control, THIS2IOLECLIENTSITE( This ) ); IOleObject_SetClientSite( This->control, &This->IOleClientSite_iface );
SetWindowLongPtrW( hWnd, GWLP_USERDATA, (ULONG_PTR) This ); SetWindowLongPtrW( hWnd, GWLP_USERDATA, (ULONG_PTR) This );
This->OrigWndProc = (WNDPROC)SetWindowLongPtrW( hWnd, GWLP_WNDPROC, (ULONG_PTR) AtlHost_wndproc ); This->OrigWndProc = (WNDPROC)SetWindowLongPtrW( hWnd, GWLP_WNDPROC, (ULONG_PTR) AtlHost_wndproc );
@ -876,7 +916,8 @@ static HRESULT IOCS_Init( IOCS *This )
GetClientRect( This->hWnd, &rect ); GetClientRect( This->hWnd, &rect );
IOCS_OnSize( This, &rect ); IOCS_OnSize( This, &rect );
IOleObject_DoVerb( This->control, OLEIVERB_INPLACEACTIVATE, NULL, THIS2IOLECLIENTSITE( This ), 0, This->hWnd, &rect ); IOleObject_DoVerb( This->control, OLEIVERB_INPLACEACTIVATE, NULL, &This->IOleClientSite_iface,
0, This->hWnd, &rect );
return S_OK; return S_OK;
} }
@ -895,11 +936,11 @@ static HRESULT IOCS_Create( HWND hWnd, IUnknown *pUnkControl, IOCS **ppSite )
if (!This) if (!This)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
This->lpOleClientSiteVtbl = &OleClientSite_vtbl; This->IOleClientSite_iface.lpVtbl = &OleClientSite_vtbl;
This->lpOleContainerVtbl = &OleContainer_vtbl; This->IOleContainer_iface.lpVtbl = &OleContainer_vtbl;
This->lpOleInPlaceSiteWindowlessVtbl = &OleInPlaceSiteWindowless_vtbl; This->IOleInPlaceSiteWindowless_iface.lpVtbl = &OleInPlaceSiteWindowless_vtbl;
This->lpOleInPlaceFrameVtbl = &OleInPlaceFrame_vtbl; This->IOleInPlaceFrame_iface.lpVtbl = &OleInPlaceFrame_vtbl;
This->lpOleControlSiteVtbl = &OleControlSite_vtbl; This->IOleControlSite_iface.lpVtbl = &OleControlSite_vtbl;
This->ref = 1; This->ref = 1;
This->OrigWndProc = NULL; This->OrigWndProc = NULL;
@ -1170,7 +1211,7 @@ static LPDLGTEMPLATEW AX_ConvertDialogTemplate(LPCDLGTEMPLATEW src_tmpl)
src += strlenW(src) + 1; /* title */ src += strlenW(src) + 1; /* title */
if ( GET_WORD(tmp) == '{' ) /* all this mess created because of this line */ if ( GET_WORD(tmp) == '{' ) /* all this mess created because of this line */
{ {
static const WCHAR AtlAxWin[9]={'A','t','l','A','x','W','i','n',0}; static const WCHAR AtlAxWin[] = {'A','t','l','A','x','W','i','n', 0};
PUT_BLOCK(AtlAxWin, sizeof(AtlAxWin)/sizeof(WCHAR)); PUT_BLOCK(AtlAxWin, sizeof(AtlAxWin)/sizeof(WCHAR));
PUT_BLOCK(tmp, strlenW(tmp)+1); PUT_BLOCK(tmp, strlenW(tmp)+1);
} else } else

View file

@ -40,7 +40,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(atl); WINE_DEFAULT_DEBUG_CHANNEL(atl);
HINSTANCE hInst; DECLSPEC_HIDDEN HINSTANCE hInst;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ {
@ -464,21 +464,29 @@ ATOM WINAPI AtlModuleRegisterWndClassInfoA(_ATL_MODULEA *pm, _ATL_WNDCLASSINFOA
TRACE("wci->m_wc.lpszClassName = %s\n", wci->m_wc.lpszClassName); TRACE("wci->m_wc.lpszClassName = %s\n", wci->m_wc.lpszClassName);
if (wci->m_lpszOrigName)
FIXME( "subclassing %s not implemented\n", debugstr_a(wci->m_lpszOrigName));
if (!wci->m_wc.lpszClassName) if (!wci->m_wc.lpszClassName)
{ {
sprintf(wci->m_szAutoName, "ATL%08lx", (UINT_PTR)wci); snprintf(wci->m_szAutoName, sizeof(wci->m_szAutoName), "ATL%08lx", (UINT_PTR)wci);
TRACE("auto-generated class name %s\n", wci->m_szAutoName); TRACE("auto-generated class name %s\n", wci->m_szAutoName);
wci->m_wc.lpszClassName = wci->m_szAutoName; wci->m_wc.lpszClassName = wci->m_szAutoName;
} }
atom = GetClassInfoExA(pm->m_hInst, wci->m_wc.lpszClassName, &wc); atom = GetClassInfoExA(pm->m_hInst, wci->m_wc.lpszClassName, &wc);
if (!atom) if (!atom)
{
wci->m_wc.hInstance = pm->m_hInst;
wci->m_wc.hCursor = LoadCursorA( wci->m_bSystemCursor ? NULL : pm->m_hInst,
wci->m_lpszCursorID );
atom = RegisterClassExA(&wci->m_wc); atom = RegisterClassExA(&wci->m_wc);
}
wci->pWndProc = wci->m_wc.lpfnWndProc; wci->pWndProc = wci->m_wc.lpfnWndProc;
wci->m_atom = atom; wci->m_atom = atom;
} }
*pProc = wci->pWndProc;
if (wci->m_lpszOrigName) *pProc = wci->pWndProc;
TRACE("returning 0x%04x\n", atom); TRACE("returning 0x%04x\n", atom);
return atom; return atom;
@ -515,22 +523,30 @@ ATOM WINAPI AtlModuleRegisterWndClassInfoW(_ATL_MODULEW *pm, _ATL_WNDCLASSINFOW
TRACE("wci->m_wc.lpszClassName = %s\n", debugstr_w(wci->m_wc.lpszClassName)); TRACE("wci->m_wc.lpszClassName = %s\n", debugstr_w(wci->m_wc.lpszClassName));
if (wci->m_lpszOrigName)
FIXME( "subclassing %s not implemented\n", debugstr_w(wci->m_lpszOrigName));
if (!wci->m_wc.lpszClassName) if (!wci->m_wc.lpszClassName)
{ {
static const WCHAR szFormat[] = {'A','T','L','%','0','8','l','x',0}; static const WCHAR szFormat[] = {'A','T','L','%','0','8','l','x',0};
sprintfW(wci->m_szAutoName, szFormat, (UINT_PTR)wci); snprintfW(wci->m_szAutoName, sizeof(wci->m_szAutoName)/sizeof(WCHAR), szFormat, (UINT_PTR)wci);
TRACE("auto-generated class name %s\n", debugstr_w(wci->m_szAutoName)); TRACE("auto-generated class name %s\n", debugstr_w(wci->m_szAutoName));
wci->m_wc.lpszClassName = wci->m_szAutoName; wci->m_wc.lpszClassName = wci->m_szAutoName;
} }
atom = GetClassInfoExW(pm->m_hInst, wci->m_wc.lpszClassName, &wc); atom = GetClassInfoExW(pm->m_hInst, wci->m_wc.lpszClassName, &wc);
if (!atom) if (!atom)
{
wci->m_wc.hInstance = pm->m_hInst;
wci->m_wc.hCursor = LoadCursorW( wci->m_bSystemCursor ? NULL : pm->m_hInst,
wci->m_lpszCursorID );
atom = RegisterClassExW(&wci->m_wc); atom = RegisterClassExW(&wci->m_wc);
}
wci->pWndProc = wci->m_wc.lpfnWndProc; wci->pWndProc = wci->m_wc.lpfnWndProc;
wci->m_atom = atom; wci->m_atom = atom;
} }
*pProc = wci->pWndProc;
if (wci->m_lpszOrigName) *pProc = wci->pWndProc;
TRACE("returning 0x%04x\n", atom); TRACE("returning 0x%04x\n", atom);
return atom; return atom;

View file

@ -11,3 +11,46 @@ Index: atl_main.c
size = pM->cbSize; size = pM->cbSize;
switch (size) switch (size)
Index: registrar.c
===================================================================
--- registrar.c (revision 48273)
+++ registrar.c (revision 48273)
@@ -819,6 +819,19 @@
return hres;
}
+static HRESULT do_register_server(BOOL do_register)
+{
+ static const WCHAR CLSID_RegistrarW[] =
+ {'C','L','S','I','D','_','R','e','g','i','s','t','r','a','r',0};
+ static const WCHAR atl_dllW[] = {'a','t','l','.','d','l','l',0};
+
+ WCHAR clsid_str[40];
+ const struct _ATL_REGMAP_ENTRY reg_map[] = {{CLSID_RegistrarW, clsid_str}, {NULL,NULL}};
+
+ StringFromGUID2(&CLSID_Registrar, clsid_str, sizeof(clsid_str)/sizeof(WCHAR));
+ return do_register_dll_server(NULL, atl_dllW, MAKEINTRESOURCEW(101), do_register, reg_map);
+}
+
/***********************************************************************
* AtlModuleUpdateRegistryFromResourceD [ATL.@]
*
@@ -849,7 +862,8 @@
*/
HRESULT WINAPI DllRegisterServer(void)
{
- return __wine_register_resources( hInst );
+ /* Note: we can't use __wine_register_server here because it uses CLSID_Registrar which isn't registred yet */
+ return do_register_server(TRUE);
}
/***********************************************************************
@@ -857,7 +871,7 @@
*/
HRESULT WINAPI DllUnregisterServer(void)
{
- return __wine_unregister_resources( hInst );
+ return do_register_server(FALSE);
}
/***********************************************************************

View file

@ -27,8 +27,7 @@
#include "winreg.h" #include "winreg.h"
#include "objbase.h" #include "objbase.h"
#include "oaidl.h" #include "oaidl.h"
#include "rpcproxy.h"
#define ATL_INITGUID
#include "atliface.h" #include "atliface.h"
#include "atlbase.h" #include "atlbase.h"
@ -78,7 +77,7 @@ typedef struct rep_list_str {
} rep_list; } rep_list;
typedef struct { typedef struct {
const IRegistrarVtbl *lpVtbl; IRegistrar IRegistrar_iface;
LONG ref; LONG ref;
rep_list *rep; rep_list *rep;
} Registrar; } Registrar;
@ -89,6 +88,11 @@ typedef struct {
DWORD len; DWORD len;
} strbuf; } strbuf;
static inline Registrar *impl_from_IRegistrar(IRegistrar *iface)
{
return CONTAINING_RECORD(iface, Registrar, IRegistrar_iface);
}
static void strbuf_init(strbuf *buf) static void strbuf_init(strbuf *buf)
{ {
buf->str = HeapAlloc(GetProcessHeap(), 0, 128*sizeof(WCHAR)); buf->str = HeapAlloc(GetProcessHeap(), 0, 128*sizeof(WCHAR));
@ -285,15 +289,11 @@ static HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, BOO
} }
break; break;
case 'd': { case 'd': {
WCHAR *end;
DWORD dw; DWORD dw;
if(*iter == '0' && iter[1] == 'x') { hres = get_word(&iter, buf);
iter += 2; if(FAILED(hres))
dw = strtolW(iter, &end, 16); break;
}else { dw = atoiW(buf->str);
dw = strtolW(iter, &end, 10);
}
iter = end;
lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_DWORD, lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_DWORD,
(PBYTE)&dw, sizeof(dw)); (PBYTE)&dw, sizeof(dw));
if(lres != ERROR_SUCCESS) { if(lres != ERROR_SUCCESS) {
@ -303,6 +303,41 @@ static HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, BOO
} }
break; break;
} }
case 'b': {
BYTE *bytes;
DWORD count;
DWORD i;
hres = get_word(&iter, buf);
if(FAILED(hres))
break;
count = (lstrlenW(buf->str) + 1) / 2;
bytes = HeapAlloc(GetProcessHeap(), 0, count);
if(bytes == NULL) {
hres = E_OUTOFMEMORY;
break;
}
for(i = 0; i < count && buf->str[2*i]; i++) {
WCHAR digits[3];
if(!isxdigitW(buf->str[2*i]) || !isxdigitW(buf->str[2*i + 1])) {
hres = E_FAIL;
break;
}
digits[0] = buf->str[2*i];
digits[1] = buf->str[2*i + 1];
digits[2] = 0;
bytes[i] = (BYTE) strtoulW(digits, NULL, 16);
}
if(SUCCEEDED(hres)) {
lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_BINARY,
bytes, count);
if(lres != ERROR_SUCCESS) {
WARN("Could not set value of key: 0x%08x\n", lres);
hres = HRESULT_FROM_WIN32(lres);
}
}
HeapFree(GetProcessHeap(), 0, bytes);
break;
}
default: default:
WARN("Wrong resource type: %s\n", debugstr_w(buf->str)); WARN("Wrong resource type: %s\n", debugstr_w(buf->str));
hres = DISP_E_EXCEPTION; hres = DISP_E_EXCEPTION;
@ -518,7 +553,7 @@ static HRESULT WINAPI Registrar_QueryInterface(IRegistrar *iface, REFIID riid, v
static ULONG WINAPI Registrar_AddRef(IRegistrar *iface) static ULONG WINAPI Registrar_AddRef(IRegistrar *iface)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
ULONG ref = InterlockedIncrement(&This->ref); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ->%d\n", This, ref); TRACE("(%p) ->%d\n", This, ref);
return ref; return ref;
@ -526,7 +561,7 @@ static ULONG WINAPI Registrar_AddRef(IRegistrar *iface)
static ULONG WINAPI Registrar_Release(IRegistrar *iface) static ULONG WINAPI Registrar_Release(IRegistrar *iface)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
ULONG ref = InterlockedDecrement(&This->ref); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ->%d\n", This, ref); TRACE("(%p) ->%d\n", This, ref);
@ -540,7 +575,7 @@ static ULONG WINAPI Registrar_Release(IRegistrar *iface)
static HRESULT WINAPI Registrar_AddReplacement(IRegistrar *iface, LPCOLESTR Key, LPCOLESTR item) static HRESULT WINAPI Registrar_AddReplacement(IRegistrar *iface, LPCOLESTR Key, LPCOLESTR item)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
int len; int len;
rep_list *new_rep; rep_list *new_rep;
@ -564,7 +599,7 @@ static HRESULT WINAPI Registrar_AddReplacement(IRegistrar *iface, LPCOLESTR Key,
static HRESULT WINAPI Registrar_ClearReplacements(IRegistrar *iface) static HRESULT WINAPI Registrar_ClearReplacements(IRegistrar *iface)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
rep_list *iter, *iter2; rep_list *iter, *iter2;
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
@ -588,7 +623,7 @@ static HRESULT WINAPI Registrar_ClearReplacements(IRegistrar *iface)
static HRESULT WINAPI Registrar_ResourceRegisterSz(IRegistrar* iface, LPCOLESTR resFileName, static HRESULT WINAPI Registrar_ResourceRegisterSz(IRegistrar* iface, LPCOLESTR resFileName,
LPCOLESTR szID, LPCOLESTR szType) LPCOLESTR szID, LPCOLESTR szType)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType)); TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType));
return resource_register(This, resFileName, szID, szType, TRUE); return resource_register(This, resFileName, szID, szType, TRUE);
} }
@ -596,35 +631,35 @@ static HRESULT WINAPI Registrar_ResourceRegisterSz(IRegistrar* iface, LPCOLESTR
static HRESULT WINAPI Registrar_ResourceUnregisterSz(IRegistrar* iface, LPCOLESTR resFileName, static HRESULT WINAPI Registrar_ResourceUnregisterSz(IRegistrar* iface, LPCOLESTR resFileName,
LPCOLESTR szID, LPCOLESTR szType) LPCOLESTR szID, LPCOLESTR szType)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType)); TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType));
return resource_register(This, resFileName, szID, szType, FALSE); return resource_register(This, resFileName, szID, szType, FALSE);
} }
static HRESULT WINAPI Registrar_FileRegister(IRegistrar* iface, LPCOLESTR fileName) static HRESULT WINAPI Registrar_FileRegister(IRegistrar* iface, LPCOLESTR fileName)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s)\n", This, debugstr_w(fileName)); TRACE("(%p)->(%s)\n", This, debugstr_w(fileName));
return file_register(This, fileName, TRUE); return file_register(This, fileName, TRUE);
} }
static HRESULT WINAPI Registrar_FileUnregister(IRegistrar* iface, LPCOLESTR fileName) static HRESULT WINAPI Registrar_FileUnregister(IRegistrar* iface, LPCOLESTR fileName)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(fileName)); FIXME("(%p)->(%s)\n", This, debugstr_w(fileName));
return file_register(This, fileName, FALSE); return file_register(This, fileName, FALSE);
} }
static HRESULT WINAPI Registrar_StringRegister(IRegistrar* iface, LPCOLESTR data) static HRESULT WINAPI Registrar_StringRegister(IRegistrar* iface, LPCOLESTR data)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s)\n", This, debugstr_w(data)); TRACE("(%p)->(%s)\n", This, debugstr_w(data));
return string_register(This, data, TRUE); return string_register(This, data, TRUE);
} }
static HRESULT WINAPI Registrar_StringUnregister(IRegistrar* iface, LPCOLESTR data) static HRESULT WINAPI Registrar_StringUnregister(IRegistrar* iface, LPCOLESTR data)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s)\n", This, debugstr_w(data)); TRACE("(%p)->(%s)\n", This, debugstr_w(data));
return string_register(This, data, FALSE); return string_register(This, data, FALSE);
} }
@ -632,7 +667,7 @@ static HRESULT WINAPI Registrar_StringUnregister(IRegistrar* iface, LPCOLESTR da
static HRESULT WINAPI Registrar_ResourceRegister(IRegistrar* iface, LPCOLESTR resFileName, static HRESULT WINAPI Registrar_ResourceRegister(IRegistrar* iface, LPCOLESTR resFileName,
UINT nID, LPCOLESTR szType) UINT nID, LPCOLESTR szType)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s %d %s)\n", iface, debugstr_w(resFileName), nID, debugstr_w(szType)); TRACE("(%p)->(%s %d %s)\n", iface, debugstr_w(resFileName), nID, debugstr_w(szType));
return resource_register(This, resFileName, MAKEINTRESOURCEW(nID), szType, TRUE); return resource_register(This, resFileName, MAKEINTRESOURCEW(nID), szType, TRUE);
} }
@ -640,7 +675,7 @@ static HRESULT WINAPI Registrar_ResourceRegister(IRegistrar* iface, LPCOLESTR re
static HRESULT WINAPI Registrar_ResourceUnregister(IRegistrar* iface, LPCOLESTR resFileName, static HRESULT WINAPI Registrar_ResourceUnregister(IRegistrar* iface, LPCOLESTR resFileName,
UINT nID, LPCOLESTR szType) UINT nID, LPCOLESTR szType)
{ {
Registrar *This = (Registrar*)iface; Registrar *This = impl_from_IRegistrar(iface);
TRACE("(%p)->(%s %d %s)\n", This, debugstr_w(resFileName), nID, debugstr_w(szType)); TRACE("(%p)->(%s %d %s)\n", This, debugstr_w(resFileName), nID, debugstr_w(szType));
return resource_register(This, resFileName, MAKEINTRESOURCEW(nID), szType, FALSE); return resource_register(This, resFileName, MAKEINTRESOURCEW(nID), szType, FALSE);
} }
@ -669,7 +704,7 @@ static HRESULT Registrar_create(const IUnknown *pUnkOuter, REFIID riid, void **p
return E_NOINTERFACE; return E_NOINTERFACE;
ret = HeapAlloc(GetProcessHeap(), 0, sizeof(Registrar)); ret = HeapAlloc(GetProcessHeap(), 0, sizeof(Registrar));
ret->lpVtbl = &RegistrarVtbl; ret->IRegistrar_iface.lpVtbl = &RegistrarVtbl;
ret->ref = 1; ret->ref = 1;
ret->rep = NULL; ret->rep = NULL;
*ppvObject = ret; *ppvObject = ret;
@ -827,16 +862,15 @@ HRESULT WINAPI AtlModuleUpdateRegistryFromResourceD(_ATL_MODULEW* pM, LPCOLESTR
*/ */
HRESULT WINAPI DllRegisterServer(void) HRESULT WINAPI DllRegisterServer(void)
{ {
TRACE("\n"); /* Note: we can't use __wine_register_server here because it uses CLSID_Registrar which isn't registred yet */
return do_register_server(TRUE); return do_register_server(TRUE);
} }
/*********************************************************************** /***********************************************************************
* DllRegisterServer (ATL.@) * DllUnRegisterServer (ATL.@)
*/ */
HRESULT WINAPI DllUnregisterServer(void) HRESULT WINAPI DllUnregisterServer(void)
{ {
TRACE("\n");
return do_register_server(FALSE); return do_register_server(FALSE);
} }