msscript: Implement SetClientSite()/GetClientSite().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Nikolay Sivov 2016-06-07 11:29:36 +03:00 committed by Alexandre Julliard
parent bcbacd7594
commit b67a6a3c4b
2 changed files with 109 additions and 5 deletions

View File

@ -32,6 +32,7 @@ struct ScriptControl {
IScriptControl IScriptControl_iface;
IOleObject IOleObject_iface;
LONG ref;
IOleClientSite *site;
};
static HINSTANCE msscript_instance;
@ -168,8 +169,11 @@ static ULONG WINAPI ScriptControl_Release(IScriptControl *iface)
TRACE("(%p) ref=%d\n", This, ref);
if(!ref)
if(!ref) {
if (This->site)
IOleClientSite_Release(This->site);
heap_free(This);
}
return ref;
}
@ -445,18 +449,30 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
{
ScriptControl *This = impl_from_IOleObject(iface);
FIXME("(%p)->(%p)\n", This, site);
TRACE("(%p)->(%p)\n", This, site);
return E_NOTIMPL;
if (This->site)
IOleClientSite_Release(This->site);
if ((This->site = site))
IOleClientSite_AddRef(site);
return S_OK;
}
static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **site)
{
ScriptControl *This = impl_from_IOleObject(iface);
FIXME("(%p)->(%p)\n", This, site);
TRACE("(%p)->(%p)\n", This, site);
return E_NOTIMPL;
if (!site)
return E_POINTER;
if ((*site = This->site))
IOleClientSite_AddRef(*site);
return S_OK;
}
static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR containerapp, LPCOLESTR containerobj)
@ -673,6 +689,7 @@ static HRESULT WINAPI ScriptControl_CreateInstance(IClassFactory *iface, IUnknow
script_control->IScriptControl_iface.lpVtbl = &ScriptControlVtbl;
script_control->IOleObject_iface.lpVtbl = &OleObjectVtbl;
script_control->ref = 1;
script_control->site = NULL;
hres = IScriptControl_QueryInterface(&script_control->IScriptControl_iface, riid, ppv);
IScriptControl_Release(&script_control->IScriptControl_iface);

View File

@ -25,8 +25,77 @@
#include "msscript.h"
#include "wine/test.h"
static HRESULT WINAPI OleClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **obj)
{
if (IsEqualIID(riid, &IID_IOleClientSite) || IsEqualIID(riid, &IID_IUnknown))
{
*obj = iface;
IOleClientSite_AddRef(iface);
return S_OK;
}
*obj = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI OleClientSite_AddRef(IOleClientSite *iface)
{
return 2;
}
static ULONG WINAPI OleClientSite_Release(IOleClientSite *iface)
{
return 1;
}
static HRESULT WINAPI OleClientSite_SaveObject(IOleClientSite *iface)
{
return E_NOTIMPL;
}
static HRESULT WINAPI OleClientSite_GetMoniker(IOleClientSite *iface, DWORD assign,
DWORD which, IMoniker **moniker)
{
return E_NOTIMPL;
}
static HRESULT WINAPI OleClientSite_GetContainer(IOleClientSite *iface, IOleContainer **container)
{
return E_NOTIMPL;
}
static HRESULT WINAPI OleClientSite_ShowObject(IOleClientSite *iface)
{
return E_NOTIMPL;
}
static HRESULT WINAPI OleClientSite_OnShowWindow(IOleClientSite *iface, BOOL show)
{
return E_NOTIMPL;
}
static HRESULT WINAPI OleClientSite_RequestNewObjectLayout(IOleClientSite *iface)
{
return E_NOTIMPL;
}
static const IOleClientSiteVtbl OleClientSiteVtbl = {
OleClientSite_QueryInterface,
OleClientSite_AddRef,
OleClientSite_Release,
OleClientSite_SaveObject,
OleClientSite_GetMoniker,
OleClientSite_GetContainer,
OleClientSite_ShowObject,
OleClientSite_OnShowWindow,
OleClientSite_RequestNewObjectLayout
};
static IOleClientSite testclientsite = { &OleClientSiteVtbl };
static void test_oleobject(void)
{
IOleClientSite *site;
IOleObject *obj;
DWORD status;
HRESULT hr;
@ -43,6 +112,24 @@ static void test_oleobject(void)
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(status != 0, "got 0x%08x\n", status);
hr = IOleObject_SetClientSite(obj, &testclientsite);
ok(hr == S_OK, "got 0x%08x\n", hr);
if (0) /* crashes on w2k3 */
hr = IOleObject_GetClientSite(obj, NULL);
hr = IOleObject_GetClientSite(obj, &site);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(site == &testclientsite, "got %p, %p\n", site, &testclientsite);
IOleClientSite_Release(site);
hr = IOleObject_SetClientSite(obj, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IOleObject_GetClientSite(obj, &site);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(site == NULL, "got %p\n", site);
IOleObject_Release(obj);
}