Robert Shearman : ole32:
Implement several class moniker functions using the description
provided on MSDN .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 8 15:38:21 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: ae62ab039f4a1594aadf820b62084945f90d1066
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ae62ab039f4a1594aadf820b62084945f90d1066
Author: Robert Shearman <rob at codeweavers.com>
Date: Mon May 8 15:55:40 2006 +0100
ole32: Implement several class moniker functions using the description provided on MSDN.
---
dlls/ole32/classmoniker.c | 58 +++++++++++++++++++++++++++++++++++---------
dlls/ole32/tests/moniker.c | 3 --
2 files changed, 46 insertions(+), 15 deletions(-)
diff --git a/dlls/ole32/classmoniker.c b/dlls/ole32/classmoniker.c
index 74a0952..afdf48a 100644
--- a/dlls/ole32/classmoniker.c
+++ b/dlls/ole32/classmoniker.c
@@ -242,8 +242,33 @@ static HRESULT WINAPI ClassMoniker_BindT
REFIID riid,
VOID** ppvResult)
{
- FIXME("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult);
- return E_NOTIMPL;
+ ClassMoniker *This = (ClassMoniker *)iface;
+ BIND_OPTS2 bindopts;
+ IClassActivator *pActivator;
+ HRESULT hr;
+
+ TRACE("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult);
+
+ bindopts.cbStruct = sizeof(bindopts);
+ IBindCtx_GetBindOptions(pbc, (BIND_OPTS *)&bindopts);
+
+ if (!pmkToLeft)
+ return CoGetClassObject(&This->clsid, bindopts.dwClassContext, NULL,
+ riid, ppvResult);
+ else
+ {
+ hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IClassActivator,
+ (void **)&pActivator);
+ if (FAILED(hr)) return hr;
+
+ hr = IClassActivator_GetClassObject(pActivator, &This->clsid,
+ bindopts.dwClassContext,
+ bindopts.locale, riid, ppvResult);
+
+ IClassActivator_Release(pActivator);
+
+ return hr;
+ }
}
/******************************************************************************
@@ -255,8 +280,8 @@ static HRESULT WINAPI ClassMoniker_BindT
REFIID riid,
VOID** ppvResult)
{
- FIXME("(%p,%p,%p,%p)\n",pbc, pmkToLeft, riid, ppvResult);
- return E_NOTIMPL;
+ TRACE("(%p,%p,%p,%p)\n",pbc, pmkToLeft, riid, ppvResult);
+ return ClassMoniker_BindToObject(iface, pbc, pmkToLeft, riid, ppvResult);
}
/******************************************************************************
@@ -424,8 +449,9 @@ static HRESULT WINAPI ClassMoniker_IsRun
IMoniker* pmkToLeft,
IMoniker* pmkNewlyRunning)
{
- FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning);
+ TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning);
+ /* as in native */
return E_NOTIMPL;
}
@@ -437,8 +463,9 @@ static HRESULT WINAPI ClassMoniker_GetTi
IMoniker* pmkToLeft,
FILETIME* pItemTime)
{
- FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pItemTime);
- return E_NOTIMPL;
+ TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pItemTime);
+
+ return MK_E_UNAVAILABLE;
}
/******************************************************************************
@@ -463,18 +490,25 @@ static HRESULT WINAPI ClassMoniker_Commo
TRACE("(%p, %p)\n", pmkOther, ppmkPrefix);
+ *ppmkPrefix = NULL;
+
IMoniker_IsSystemMoniker(pmkOther, &mkSys);
/* If the other moniker is an class moniker that is equal to this moniker, this method sets *ppmkPrefix */
/* to this moniker and returns MK_S_US */
- if((mkSys == MKSYS_CLASSMONIKER) && (IMoniker_IsEqual(iface, pmkOther) == S_OK) ){
-
- *ppmkPrefix = iface;
+ if (mkSys == MKSYS_CLASSMONIKER)
+ {
+ if (IMoniker_IsEqual(iface, pmkOther) == S_OK)
+ {
+ *ppmkPrefix = iface;
- IMoniker_AddRef(iface);
+ IMoniker_AddRef(iface);
- return MK_S_US;
+ return MK_S_US;
+ }
+ else
+ return MK_E_NOPREFIX;
}
else
/* otherwise, the method calls the MonikerCommonPrefixWith function. This function correctly handles */
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 14dcda3..6ae8cf1 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -523,16 +523,13 @@ static void test_class_moniker(void)
ok(hr == E_NOTIMPL, "IMoniker_IsRunning should return E_NOTIMPL, not 0x%08lx\n", hr);
hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, NULL, &filetime);
- todo_wine
ok(hr == MK_E_UNAVAILABLE, "IMoniker_GetTimeOfLastChange should return MK_E_UNAVAILABLE, not 0x%08lx\n", hr);
hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown);
- todo_wine
ok_ole_success(hr, IMoniker_BindToStorage);
IUnknown_Release(unknown);
hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown);
- todo_wine
ok_ole_success(hr, IMoniker_BindToStorage);
IUnknown_Release(unknown);
More information about the wine-cvs
mailing list