mirror of
https://github.com/reactos/reactos.git
synced 2024-07-04 03:34:16 +00:00
[OLE32] Sync with Wine Staging 1.9.11. CORE-11368
svn path=/trunk/; revision=71579
This commit is contained in:
parent
76e295bbed
commit
3df7653ebe
|
@ -3181,14 +3181,14 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_multi_qi(DWORD count, MULTI_QI *mqi)
|
static void init_multi_qi(DWORD count, MULTI_QI *mqi, HRESULT hr)
|
||||||
{
|
{
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
mqi[i].pItf = NULL;
|
mqi[i].pItf = NULL;
|
||||||
mqi[i].hr = E_NOINTERFACE;
|
mqi[i].hr = hr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3244,7 +3244,7 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstanceEx(
|
||||||
if (pServerInfo)
|
if (pServerInfo)
|
||||||
FIXME("() non-NULL pServerInfo not supported!\n");
|
FIXME("() non-NULL pServerInfo not supported!\n");
|
||||||
|
|
||||||
init_multi_qi(cmq, pResults);
|
init_multi_qi(cmq, pResults, E_NOINTERFACE);
|
||||||
|
|
||||||
hres = CoGetTreatAsClass(rclsid, &clsid);
|
hres = CoGetTreatAsClass(rclsid, &clsid);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
|
@ -3328,7 +3328,7 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(
|
||||||
if (server_info)
|
if (server_info)
|
||||||
FIXME("() non-NULL server_info not supported\n");
|
FIXME("() non-NULL server_info not supported\n");
|
||||||
|
|
||||||
init_multi_qi(count, results);
|
init_multi_qi(count, results, E_NOINTERFACE);
|
||||||
|
|
||||||
/* optionally get CLSID from a file */
|
/* optionally get CLSID from a file */
|
||||||
if (!rclsid)
|
if (!rclsid)
|
||||||
|
@ -3350,20 +3350,30 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(
|
||||||
(void**)&unk);
|
(void**)&unk);
|
||||||
|
|
||||||
if (hr != S_OK)
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
init_multi_qi(count, results, hr);
|
||||||
return hr;
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
/* init from file */
|
/* init from file */
|
||||||
hr = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&pf);
|
hr = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&pf);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
ERR("failed to get IPersistFile\n");
|
|
||||||
|
|
||||||
if (pf)
|
|
||||||
{
|
{
|
||||||
IPersistFile_Load(pf, filename, grfmode);
|
init_multi_qi(count, results, hr);
|
||||||
IPersistFile_Release(pf);
|
IUnknown_Release(unk);
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr = IPersistFile_Load(pf, filename, grfmode);
|
||||||
|
IPersistFile_Release(pf);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
return return_multi_qi(unk, count, results, FALSE);
|
return return_multi_qi(unk, count, results, FALSE);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
init_multi_qi(count, results, hr);
|
||||||
|
IUnknown_Release(unk);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -3390,7 +3400,7 @@ HRESULT WINAPI CoGetInstanceFromIStorage(
|
||||||
if (server_info)
|
if (server_info)
|
||||||
FIXME("() non-NULL server_info not supported\n");
|
FIXME("() non-NULL server_info not supported\n");
|
||||||
|
|
||||||
init_multi_qi(count, results);
|
init_multi_qi(count, results, E_NOINTERFACE);
|
||||||
|
|
||||||
/* optionally get CLSID from a file */
|
/* optionally get CLSID from a file */
|
||||||
if (!rclsid)
|
if (!rclsid)
|
||||||
|
@ -3828,6 +3838,20 @@ DWORD WINAPI CoGetCurrentProcess(void)
|
||||||
return GetCurrentProcessId();
|
return GetCurrentProcessId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* CoGetCurrentLogicalThreadId [OLE32.@]
|
||||||
|
*/
|
||||||
|
HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *id)
|
||||||
|
{
|
||||||
|
TRACE("(%p)\n", id);
|
||||||
|
|
||||||
|
if (!id)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
*id = COM_CurrentCausalityId();
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* CoRegisterMessageFilter [OLE32.@]
|
* CoRegisterMessageFilter [OLE32.@]
|
||||||
*
|
*
|
||||||
|
@ -4595,7 +4619,6 @@ typedef struct Context
|
||||||
IContextCallback IContextCallback_iface;
|
IContextCallback IContextCallback_iface;
|
||||||
IObjContext IObjContext_iface;
|
IObjContext IObjContext_iface;
|
||||||
LONG refs;
|
LONG refs;
|
||||||
APTTYPE apttype;
|
|
||||||
} Context;
|
} Context;
|
||||||
|
|
||||||
static inline Context *impl_from_IComThreadingInfo( IComThreadingInfo *iface )
|
static inline Context *impl_from_IComThreadingInfo( IComThreadingInfo *iface )
|
||||||
|
@ -4648,10 +4671,15 @@ static ULONG Context_AddRef(Context *This)
|
||||||
|
|
||||||
static ULONG Context_Release(Context *This)
|
static ULONG Context_Release(Context *This)
|
||||||
{
|
{
|
||||||
ULONG refs = InterlockedDecrement(&This->refs);
|
/* Context instance is initially created with CoGetContextToken() with refcount set to 0,
|
||||||
if (!refs)
|
releasing context while refcount is at 0 destroys it. */
|
||||||
|
if (!This->refs)
|
||||||
|
{
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
return refs;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return InterlockedDecrement(&This->refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI Context_CTI_QueryInterface(IComThreadingInfo *iface, REFIID riid, LPVOID *ppv)
|
static HRESULT WINAPI Context_CTI_QueryInterface(IComThreadingInfo *iface, REFIID riid, LPVOID *ppv)
|
||||||
|
@ -4674,21 +4702,26 @@ static ULONG WINAPI Context_CTI_Release(IComThreadingInfo *iface)
|
||||||
|
|
||||||
static HRESULT WINAPI Context_CTI_GetCurrentApartmentType(IComThreadingInfo *iface, APTTYPE *apttype)
|
static HRESULT WINAPI Context_CTI_GetCurrentApartmentType(IComThreadingInfo *iface, APTTYPE *apttype)
|
||||||
{
|
{
|
||||||
Context *This = impl_from_IComThreadingInfo(iface);
|
APTTYPEQUALIFIER qualifier;
|
||||||
|
|
||||||
TRACE("(%p)\n", apttype);
|
TRACE("(%p)\n", apttype);
|
||||||
|
|
||||||
*apttype = This->apttype;
|
return CoGetApartmentType(apttype, &qualifier);
|
||||||
return S_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI Context_CTI_GetCurrentThreadType(IComThreadingInfo *iface, THDTYPE *thdtype)
|
static HRESULT WINAPI Context_CTI_GetCurrentThreadType(IComThreadingInfo *iface, THDTYPE *thdtype)
|
||||||
{
|
{
|
||||||
Context *This = impl_from_IComThreadingInfo(iface);
|
APTTYPEQUALIFIER qualifier;
|
||||||
|
APTTYPE apttype;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = CoGetApartmentType(&apttype, &qualifier);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
TRACE("(%p)\n", thdtype);
|
TRACE("(%p)\n", thdtype);
|
||||||
|
|
||||||
switch (This->apttype)
|
switch (apttype)
|
||||||
{
|
{
|
||||||
case APTTYPE_STA:
|
case APTTYPE_STA:
|
||||||
case APTTYPE_MAINSTA:
|
case APTTYPE_MAINSTA:
|
||||||
|
@ -4703,8 +4736,8 @@ static HRESULT WINAPI Context_CTI_GetCurrentThreadType(IComThreadingInfo *iface,
|
||||||
|
|
||||||
static HRESULT WINAPI Context_CTI_GetCurrentLogicalThreadId(IComThreadingInfo *iface, GUID *logical_thread_id)
|
static HRESULT WINAPI Context_CTI_GetCurrentLogicalThreadId(IComThreadingInfo *iface, GUID *logical_thread_id)
|
||||||
{
|
{
|
||||||
FIXME("(%p): stub\n", logical_thread_id);
|
TRACE("(%p)\n", logical_thread_id);
|
||||||
return E_NOTIMPL;
|
return CoGetCurrentLogicalThreadId(logical_thread_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI Context_CTI_SetCurrentLogicalThreadId(IComThreadingInfo *iface, REFGUID logical_thread_id)
|
static HRESULT WINAPI Context_CTI_SetCurrentLogicalThreadId(IComThreadingInfo *iface, REFGUID logical_thread_id)
|
||||||
|
@ -4884,44 +4917,18 @@ static const IObjContextVtbl Context_Object_Vtbl =
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
|
HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
APARTMENT *apt = COM_CurrentApt();
|
IObjContext *context;
|
||||||
Context *context;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
|
TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
if (!apt)
|
hr = CoGetContextToken((ULONG_PTR*)&context);
|
||||||
{
|
if (FAILED(hr))
|
||||||
if (!(apt = apartment_find_multi_threaded()))
|
|
||||||
{
|
|
||||||
ERR("apartment not initialised\n");
|
|
||||||
return CO_E_NOTINITIALIZED;
|
|
||||||
}
|
|
||||||
apartment_release(apt);
|
|
||||||
}
|
|
||||||
|
|
||||||
context = HeapAlloc(GetProcessHeap(), 0, sizeof(*context));
|
|
||||||
if (!context)
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
context->IComThreadingInfo_iface.lpVtbl = &Context_Threading_Vtbl;
|
|
||||||
context->IContextCallback_iface.lpVtbl = &Context_Callback_Vtbl;
|
|
||||||
context->IObjContext_iface.lpVtbl = &Context_Object_Vtbl;
|
|
||||||
context->refs = 1;
|
|
||||||
if (apt->multi_threaded)
|
|
||||||
context->apttype = APTTYPE_MTA;
|
|
||||||
else if (apt->main)
|
|
||||||
context->apttype = APTTYPE_MAINSTA;
|
|
||||||
else
|
|
||||||
context->apttype = APTTYPE_STA;
|
|
||||||
|
|
||||||
hr = IComThreadingInfo_QueryInterface(&context->IComThreadingInfo_iface, riid, ppv);
|
|
||||||
IComThreadingInfo_Release(&context->IComThreadingInfo_iface);
|
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
|
||||||
|
|
||||||
|
return IObjContext_QueryInterface(context, riid, ppv);
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CoGetContextToken [OLE32.@]
|
* CoGetContextToken [OLE32.@]
|
||||||
|
@ -4951,16 +4958,24 @@ HRESULT WINAPI CoGetContextToken( ULONG_PTR *token )
|
||||||
|
|
||||||
if (!info->context_token)
|
if (!info->context_token)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
Context *context;
|
||||||
IObjContext *ctx;
|
|
||||||
|
|
||||||
hr = CoGetObjectContext(&IID_IObjContext, (void **)&ctx);
|
context = HeapAlloc(GetProcessHeap(), 0, sizeof(*context));
|
||||||
if (FAILED(hr)) return hr;
|
if (!context)
|
||||||
info->context_token = ctx;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
context->IComThreadingInfo_iface.lpVtbl = &Context_Threading_Vtbl;
|
||||||
|
context->IContextCallback_iface.lpVtbl = &Context_Callback_Vtbl;
|
||||||
|
context->IObjContext_iface.lpVtbl = &Context_Object_Vtbl;
|
||||||
|
/* Context token does not take a reference, it's always zero until
|
||||||
|
interface is explicitely requested with CoGetObjectContext(). */
|
||||||
|
context->refs = 0;
|
||||||
|
|
||||||
|
info->context_token = &context->IObjContext_iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
*token = (ULONG_PTR)info->context_token;
|
*token = (ULONG_PTR)info->context_token;
|
||||||
TRACE("apt->context_token=%p\n", info->context_token);
|
TRACE("context_token=%p\n", info->context_token);
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -5013,7 +5028,7 @@ HRESULT WINAPI CoGetApartmentType(APTTYPE *type, APTTYPEQUALIFIER *qualifier)
|
||||||
{
|
{
|
||||||
struct oletls *info = COM_CurrentInfo();
|
struct oletls *info = COM_CurrentInfo();
|
||||||
|
|
||||||
FIXME("(%p %p): semi-stub\n", type, qualifier);
|
FIXME("(%p, %p): semi-stub\n", type, qualifier);
|
||||||
|
|
||||||
if (!type || !qualifier)
|
if (!type || !qualifier)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
@ -5032,7 +5047,7 @@ HRESULT WINAPI CoGetApartmentType(APTTYPE *type, APTTYPEQUALIFIER *qualifier)
|
||||||
|
|
||||||
*qualifier = APTTYPEQUALIFIER_NONE;
|
*qualifier = APTTYPEQUALIFIER_NONE;
|
||||||
|
|
||||||
return info->apt ? ERROR_SUCCESS : CO_E_NOTINITIALIZED;
|
return info->apt ? S_OK : CO_E_NOTINITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -64,7 +64,7 @@ static inline EnumMonikerImpl *impl_from_IEnumMoniker(IEnumMoniker *iface)
|
||||||
return CONTAINING_RECORD(iface, EnumMonikerImpl, IEnumMoniker_iface);
|
return CONTAINING_RECORD(iface, EnumMonikerImpl, IEnumMoniker_iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tabSize,ULONG currentPos,BOOL leftToRigth,IEnumMoniker ** ppmk);
|
static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tabSize,ULONG currentPos,BOOL leftToRight,IEnumMoniker ** ppmk);
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* CompositeMoniker_QueryInterface
|
* CompositeMoniker_QueryInterface
|
||||||
|
@ -320,7 +320,7 @@ CompositeMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc,
|
||||||
{
|
{
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
IRunningObjectTable *prot;
|
IRunningObjectTable *prot;
|
||||||
IMoniker *tempMk,*antiMk,*mostRigthMk;
|
IMoniker *tempMk,*antiMk,*rightMostMk;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
|
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
|
||||||
|
@ -349,17 +349,17 @@ CompositeMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc,
|
||||||
/* component of the composite, passing the rest of the composite as the pmkToLeft parameter for that call */
|
/* component of the composite, passing the rest of the composite as the pmkToLeft parameter for that call */
|
||||||
|
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
|
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
res=CreateAntiMoniker(&antiMk);
|
res=CreateAntiMoniker(&antiMk);
|
||||||
res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
||||||
IMoniker_Release(antiMk);
|
IMoniker_Release(antiMk);
|
||||||
|
|
||||||
res=IMoniker_BindToObject(mostRigthMk,pbc,tempMk,riid,ppvResult);
|
res=IMoniker_BindToObject(rightMostMk,pbc,tempMk,riid,ppvResult);
|
||||||
|
|
||||||
IMoniker_Release(tempMk);
|
IMoniker_Release(tempMk);
|
||||||
IMoniker_Release(mostRigthMk);
|
IMoniker_Release(rightMostMk);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
@ -373,7 +373,7 @@ CompositeMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc,
|
||||||
IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
|
IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
|
||||||
{
|
{
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk;
|
IMoniker *tempMk,*antiMk,*rightMostMk,*leftMk;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
|
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
|
||||||
|
@ -392,7 +392,7 @@ CompositeMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc,
|
||||||
leftMk = iface;
|
leftMk = iface;
|
||||||
|
|
||||||
IMoniker_Enum(iface, FALSE, &enumMoniker);
|
IMoniker_Enum(iface, FALSE, &enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL);
|
IEnumMoniker_Next(enumMoniker, 1, &rightMostMk, NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
res = CreateAntiMoniker(&antiMk);
|
res = CreateAntiMoniker(&antiMk);
|
||||||
|
@ -401,11 +401,11 @@ CompositeMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc,
|
||||||
if (FAILED(res)) return res;
|
if (FAILED(res)) return res;
|
||||||
IMoniker_Release(antiMk);
|
IMoniker_Release(antiMk);
|
||||||
|
|
||||||
res = IMoniker_BindToStorage(mostRigthMk, pbc, tempMk, riid, ppvResult);
|
res = IMoniker_BindToStorage(rightMostMk, pbc, tempMk, riid, ppvResult);
|
||||||
|
|
||||||
IMoniker_Release(tempMk);
|
IMoniker_Release(tempMk);
|
||||||
|
|
||||||
IMoniker_Release(mostRigthMk);
|
IMoniker_Release(rightMostMk);
|
||||||
|
|
||||||
if (pmkToLeft)
|
if (pmkToLeft)
|
||||||
IMoniker_Release(leftMk);
|
IMoniker_Release(leftMk);
|
||||||
|
@ -420,7 +420,7 @@ static HRESULT WINAPI
|
||||||
CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
|
CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
|
||||||
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
|
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
|
||||||
{
|
{
|
||||||
IMoniker *tempMk,*antiMk,*mostRigthMk,*leftReducedComposedMk,*mostRigthReducedMk;
|
IMoniker *tempMk,*antiMk,*rightMostMk,*leftReducedComposedMk,*rightMostReducedMk;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
|
|
||||||
TRACE("(%p,%p,%d,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
|
TRACE("(%p,%p,%d,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
|
||||||
|
@ -433,14 +433,14 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
|
||||||
if (ppmkToLeft==NULL){
|
if (ppmkToLeft==NULL){
|
||||||
|
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
|
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
CreateAntiMoniker(&antiMk);
|
CreateAntiMoniker(&antiMk);
|
||||||
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
||||||
IMoniker_Release(antiMk);
|
IMoniker_Release(antiMk);
|
||||||
|
|
||||||
return IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
|
return IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
|
||||||
}
|
}
|
||||||
else if (*ppmkToLeft==NULL)
|
else if (*ppmkToLeft==NULL)
|
||||||
|
|
||||||
|
@ -450,7 +450,7 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
|
||||||
|
|
||||||
/* separate the composite moniker in to left and right moniker */
|
/* separate the composite moniker in to left and right moniker */
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
|
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
CreateAntiMoniker(&antiMk);
|
CreateAntiMoniker(&antiMk);
|
||||||
|
@ -459,11 +459,11 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
|
||||||
|
|
||||||
/* If any of the components reduces itself, the method returns S_OK and passes back a composite */
|
/* If any of the components reduces itself, the method returns S_OK and passes back a composite */
|
||||||
/* of the reduced components */
|
/* of the reduced components */
|
||||||
if (IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,NULL,&mostRigthReducedMk) &&
|
if (IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,NULL,&rightMostReducedMk) &&
|
||||||
IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk)
|
IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk)
|
||||||
)
|
)
|
||||||
|
|
||||||
return CreateGenericComposite(leftReducedComposedMk,mostRigthReducedMk,ppmkReduced);
|
return CreateGenericComposite(leftReducedComposedMk,rightMostReducedMk,ppmkReduced);
|
||||||
|
|
||||||
else{
|
else{
|
||||||
/* If no reduction occurred, the method passes back the same moniker and returns MK_S_REDUCED_TO_SELF.*/
|
/* If no reduction occurred, the method passes back the same moniker and returns MK_S_REDUCED_TO_SELF.*/
|
||||||
|
@ -613,7 +613,7 @@ CompositeMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc,
|
||||||
{
|
{
|
||||||
IRunningObjectTable* rot;
|
IRunningObjectTable* rot;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
IMoniker *tempMk,*antiMk,*mostRigthMk;
|
IMoniker *tempMk,*antiMk,*rightMostMk;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
|
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
|
||||||
|
@ -665,17 +665,17 @@ CompositeMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc,
|
||||||
else{
|
else{
|
||||||
|
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
|
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
res=CreateAntiMoniker(&antiMk);
|
res=CreateAntiMoniker(&antiMk);
|
||||||
res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
||||||
IMoniker_Release(antiMk);
|
IMoniker_Release(antiMk);
|
||||||
|
|
||||||
res=IMoniker_IsRunning(mostRigthMk,pbc,tempMk,pmkNewlyRunning);
|
res=IMoniker_IsRunning(rightMostMk,pbc,tempMk,pmkNewlyRunning);
|
||||||
|
|
||||||
IMoniker_Release(tempMk);
|
IMoniker_Release(tempMk);
|
||||||
IMoniker_Release(mostRigthMk);
|
IMoniker_Release(rightMostMk);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -690,7 +690,7 @@ CompositeMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc,
|
||||||
IMoniker* pmkToLeft, FILETIME* pCompositeTime)
|
IMoniker* pmkToLeft, FILETIME* pCompositeTime)
|
||||||
{
|
{
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk;
|
IMoniker *tempMk,*antiMk,*rightMostMk,*leftMk;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pCompositeTime);
|
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pCompositeTime);
|
||||||
|
@ -727,17 +727,17 @@ CompositeMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc,
|
||||||
leftMk = iface;
|
leftMk = iface;
|
||||||
|
|
||||||
IMoniker_Enum(iface, FALSE, &enumMoniker);
|
IMoniker_Enum(iface, FALSE, &enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL);
|
IEnumMoniker_Next(enumMoniker, 1, &rightMostMk, NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
res = CreateAntiMoniker(&antiMk);
|
res = CreateAntiMoniker(&antiMk);
|
||||||
res = IMoniker_ComposeWith(leftMk, antiMk, 0, &tempMk);
|
res = IMoniker_ComposeWith(leftMk, antiMk, 0, &tempMk);
|
||||||
IMoniker_Release(antiMk);
|
IMoniker_Release(antiMk);
|
||||||
|
|
||||||
res = IMoniker_GetTimeOfLastChange(mostRigthMk, pbc, tempMk, pCompositeTime);
|
res = IMoniker_GetTimeOfLastChange(rightMostMk, pbc, tempMk, pCompositeTime);
|
||||||
|
|
||||||
IMoniker_Release(tempMk);
|
IMoniker_Release(tempMk);
|
||||||
IMoniker_Release(mostRigthMk);
|
IMoniker_Release(rightMostMk);
|
||||||
|
|
||||||
if (pmkToLeft)
|
if (pmkToLeft)
|
||||||
IMoniker_Release(leftMk);
|
IMoniker_Release(leftMk);
|
||||||
|
@ -752,7 +752,7 @@ static HRESULT WINAPI
|
||||||
CompositeMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
|
CompositeMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
|
||||||
{
|
{
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
IMoniker *tempMk,*antiMk,*mostRigthMk,*tempInvMk,*mostRigthInvMk;
|
IMoniker *tempMk,*antiMk,*rightMostMk,*tempInvMk,*rightMostInvMk;
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
|
|
||||||
TRACE("(%p,%p)\n",iface,ppmk);
|
TRACE("(%p,%p)\n",iface,ppmk);
|
||||||
|
@ -781,18 +781,18 @@ CompositeMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
|
||||||
else{
|
else{
|
||||||
|
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
|
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
IMoniker_Inverse(mostRigthMk,&mostRigthInvMk);
|
IMoniker_Inverse(rightMostMk,&rightMostInvMk);
|
||||||
CompositeMonikerImpl_Inverse(tempMk,&tempInvMk);
|
CompositeMonikerImpl_Inverse(tempMk,&tempInvMk);
|
||||||
|
|
||||||
res=CreateGenericComposite(mostRigthInvMk,tempInvMk,ppmk);
|
res=CreateGenericComposite(rightMostInvMk,tempInvMk,ppmk);
|
||||||
|
|
||||||
IMoniker_Release(tempMk);
|
IMoniker_Release(tempMk);
|
||||||
IMoniker_Release(mostRigthMk);
|
IMoniker_Release(rightMostMk);
|
||||||
IMoniker_Release(tempInvMk);
|
IMoniker_Release(tempInvMk);
|
||||||
IMoniker_Release(mostRigthInvMk);
|
IMoniker_Release(rightMostInvMk);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1140,13 +1140,13 @@ CompositeMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc,
|
||||||
IMoniker** ppmkOut)
|
IMoniker** ppmkOut)
|
||||||
{
|
{
|
||||||
IEnumMoniker *enumMoniker;
|
IEnumMoniker *enumMoniker;
|
||||||
IMoniker *tempMk,*mostRigthMk,*antiMk;
|
IMoniker *tempMk,*rightMostMk,*antiMk;
|
||||||
/* This method recursively calls IMoniker::ParseDisplayName on the rightmost component of the composite,*/
|
/* This method recursively calls IMoniker::ParseDisplayName on the rightmost component of the composite,*/
|
||||||
/* passing everything else as the pmkToLeft parameter for that call. */
|
/* passing everything else as the pmkToLeft parameter for that call. */
|
||||||
|
|
||||||
/* get the most right moniker */
|
/* get the most right moniker */
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
||||||
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
|
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
IEnumMoniker_Release(enumMoniker);
|
||||||
|
|
||||||
/* get the left moniker */
|
/* get the left moniker */
|
||||||
|
@ -1154,7 +1154,7 @@ CompositeMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc,
|
||||||
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
||||||
IMoniker_Release(antiMk);
|
IMoniker_Release(antiMk);
|
||||||
|
|
||||||
return IMoniker_ParseDisplayName(mostRigthMk,pbc,tempMk,pszDisplayName,pchEaten,ppmkOut);
|
return IMoniker_ParseDisplayName(rightMostMk,pbc,tempMk,pszDisplayName,pchEaten,ppmkOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -1742,6 +1742,7 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
|
||||||
IMoniker *tempMk;
|
IMoniker *tempMk;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
CompositeMonikerImpl *This;
|
CompositeMonikerImpl *This;
|
||||||
|
int i;
|
||||||
|
|
||||||
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
|
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
|
||||||
|
|
||||||
|
@ -1787,12 +1788,14 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
|
||||||
|
|
||||||
|
|
||||||
if (++This->tabLastIndex==This->tabSize){
|
if (++This->tabLastIndex==This->tabSize){
|
||||||
LPVOID tab_moniker = This->tabMoniker;
|
IMoniker **tab_moniker = This->tabMoniker;
|
||||||
|
|
||||||
This->tabSize+=BLOCK_TAB_SIZE;
|
This->tabSize+=BLOCK_TAB_SIZE;
|
||||||
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(IMoniker));
|
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(This->tabMoniker[0]));
|
||||||
|
|
||||||
if (This->tabMoniker==NULL){
|
if (This->tabMoniker==NULL){
|
||||||
|
for (i = 0; i < This->tabLastIndex; i++)
|
||||||
|
IMoniker_Release(tab_moniker[i]);
|
||||||
HeapFree(GetProcessHeap(), 0, tab_moniker);
|
HeapFree(GetProcessHeap(), 0, tab_moniker);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
@ -1835,18 +1838,25 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
|
||||||
IMoniker_Release(This->tabMoniker[This->tabLastIndex-1]);
|
IMoniker_Release(This->tabMoniker[This->tabLastIndex-1]);
|
||||||
|
|
||||||
This->tabMoniker[This->tabLastIndex-1]=tempMk;
|
This->tabMoniker[This->tabLastIndex-1]=tempMk;
|
||||||
} else
|
} else{
|
||||||
|
for (i = 0; i < This->tabLastIndex; i++)
|
||||||
|
IMoniker_Release(This->tabMoniker[i]);
|
||||||
|
HeapFree(GetProcessHeap(), 0, This->tabMoniker);
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
return res;
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/* resize tabMoniker if needed */
|
/* resize tabMoniker if needed */
|
||||||
if (This->tabLastIndex==This->tabSize){
|
if (This->tabLastIndex==This->tabSize){
|
||||||
LPVOID tab_moniker = This->tabMoniker;
|
IMoniker **tab_moniker = This->tabMoniker;
|
||||||
|
|
||||||
This->tabSize+=BLOCK_TAB_SIZE;
|
This->tabSize+=BLOCK_TAB_SIZE;
|
||||||
|
|
||||||
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(IMoniker));
|
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(IMoniker));
|
||||||
|
|
||||||
if (This->tabMoniker==NULL){
|
if (This->tabMoniker==NULL){
|
||||||
|
for (i = 0; i < This->tabLastIndex; i++)
|
||||||
|
IMoniker_Release(tab_moniker[i]);
|
||||||
HeapFree(GetProcessHeap(), 0, tab_moniker);
|
HeapFree(GetProcessHeap(), 0, tab_moniker);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
@ -1883,13 +1893,15 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
|
||||||
}
|
}
|
||||||
|
|
||||||
if (This->tabLastIndex==This->tabSize){
|
if (This->tabLastIndex==This->tabSize){
|
||||||
LPVOID tab_moniker = This->tabMoniker;
|
IMoniker **tab_moniker = This->tabMoniker;
|
||||||
|
|
||||||
This->tabSize+=BLOCK_TAB_SIZE;
|
This->tabSize+=BLOCK_TAB_SIZE;
|
||||||
|
|
||||||
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(This->tabMoniker[0]));
|
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(This->tabMoniker[0]));
|
||||||
|
|
||||||
if (This->tabMoniker==NULL){
|
if (This->tabMoniker==NULL){
|
||||||
|
for (i = 0; i < This->tabLastIndex; i++)
|
||||||
|
IMoniker_Release(tab_moniker[i]);
|
||||||
HeapFree(GetProcessHeap(), 0, tab_moniker);
|
HeapFree(GetProcessHeap(), 0, tab_moniker);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
|
@ -2450,7 +2450,7 @@ HRESULT WINAPI CreateDataCache(
|
||||||
* IUnknown pointer can be returned to the outside.
|
* IUnknown pointer can be returned to the outside.
|
||||||
*/
|
*/
|
||||||
if ( pUnkOuter && !IsEqualIID(&IID_IUnknown, riid) )
|
if ( pUnkOuter && !IsEqualIID(&IID_IUnknown, riid) )
|
||||||
return CLASS_E_NOAGGREGATION;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to construct a new instance of the class.
|
* Try to construct a new instance of the class.
|
||||||
|
|
|
@ -678,22 +678,21 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
|
||||||
lastIdx2=FileMonikerImpl_DecomposePath(str2,&strDec2)-1;
|
lastIdx2=FileMonikerImpl_DecomposePath(str2,&strDec2)-1;
|
||||||
|
|
||||||
if ((lastIdx1==-1 && lastIdx2>-1)||(lastIdx1==1 && lstrcmpW(strDec1[0],twoPoint)==0))
|
if ((lastIdx1==-1 && lastIdx2>-1)||(lastIdx1==1 && lstrcmpW(strDec1[0],twoPoint)==0))
|
||||||
return MK_E_SYNTAX;
|
res = MK_E_SYNTAX;
|
||||||
|
else{
|
||||||
if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0)
|
if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0)
|
||||||
lastIdx1--;
|
lastIdx1--;
|
||||||
|
|
||||||
/* for etch "..\" in the left of str2 remove the right element from str1 */
|
/* for each "..\" in the left of str2 remove the right element from str1 */
|
||||||
for(i=0; ( (lastIdx1>=0) && (strDec2[i]!=NULL) && (lstrcmpW(strDec2[i],twoPoint)==0) ) ;i+=2){
|
for(i=0; ( (lastIdx1>=0) && (strDec2[i]!=NULL) && (lstrcmpW(strDec2[i],twoPoint)==0) ); i+=2){
|
||||||
|
|
||||||
lastIdx1-=2;
|
lastIdx1-=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the length of the composed path string is raised by the sum of the two paths lengths */
|
/* the length of the composed path string is increased by the sum of the two paths' lengths */
|
||||||
newStr=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(str1)+lstrlenW(str2)+1));
|
newStr=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(str1)+lstrlenW(str2)+1));
|
||||||
|
|
||||||
if (newStr)
|
if (newStr){
|
||||||
{
|
|
||||||
/* new path is the concatenation of the rest of str1 and str2 */
|
/* new path is the concatenation of the rest of str1 and str2 */
|
||||||
for(*newStr=0,j=0;j<=lastIdx1;j++)
|
for(*newStr=0,j=0;j<=lastIdx1;j++)
|
||||||
strcatW(newStr,strDec1[j]);
|
strcatW(newStr,strDec1[j]);
|
||||||
|
@ -707,10 +706,11 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
|
||||||
/* create a new moniker with the new string */
|
/* create a new moniker with the new string */
|
||||||
res=CreateFileMoniker(newStr,ppmkComposite);
|
res=CreateFileMoniker(newStr,ppmkComposite);
|
||||||
|
|
||||||
/* free all strings space memory used by this function */
|
/* free string memory used by this function */
|
||||||
HeapFree(GetProcessHeap(),0,newStr);
|
HeapFree(GetProcessHeap(),0,newStr);
|
||||||
}
|
}
|
||||||
else res = E_OUTOFMEMORY;
|
else res = E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
free_stringtable(strDec1);
|
free_stringtable(strDec1);
|
||||||
free_stringtable(strDec2);
|
free_stringtable(strDec2);
|
||||||
|
|
|
@ -448,13 +448,15 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy)
|
||||||
IMallocSpy* pSpy;
|
IMallocSpy* pSpy;
|
||||||
HRESULT hres = E_INVALIDARG;
|
HRESULT hres = E_INVALIDARG;
|
||||||
|
|
||||||
TRACE("\n");
|
TRACE("%p\n", pMallocSpy);
|
||||||
|
|
||||||
if(Malloc32.pSpy) return CO_E_OBJISREG;
|
if(!pMallocSpy) return E_INVALIDARG;
|
||||||
|
|
||||||
EnterCriticalSection(&IMalloc32_SpyCS);
|
EnterCriticalSection(&IMalloc32_SpyCS);
|
||||||
|
|
||||||
if (SUCCEEDED(IMallocSpy_QueryInterface(pMallocSpy, &IID_IMallocSpy, (void**)&pSpy))) {
|
if (Malloc32.pSpy)
|
||||||
|
hres = CO_E_OBJISREG;
|
||||||
|
else if (SUCCEEDED(IMallocSpy_QueryInterface(pMallocSpy, &IID_IMallocSpy, (void**)&pSpy))) {
|
||||||
Malloc32.pSpy = pSpy;
|
Malloc32.pSpy = pSpy;
|
||||||
hres = S_OK;
|
hres = S_OK;
|
||||||
}
|
}
|
||||||
|
@ -488,7 +490,9 @@ HRESULT WINAPI CoRevokeMallocSpy(void)
|
||||||
|
|
||||||
EnterCriticalSection(&IMalloc32_SpyCS);
|
EnterCriticalSection(&IMalloc32_SpyCS);
|
||||||
|
|
||||||
if (Malloc32.SpyedAllocationsLeft) {
|
if (!Malloc32.pSpy)
|
||||||
|
hres = CO_E_OBJNOTREG;
|
||||||
|
else if (Malloc32.SpyedAllocationsLeft) {
|
||||||
TRACE("SpyReleasePending with %u allocations left\n", Malloc32.SpyedAllocationsLeft);
|
TRACE("SpyReleasePending with %u allocations left\n", Malloc32.SpyedAllocationsLeft);
|
||||||
Malloc32.SpyReleasePending = TRUE;
|
Malloc32.SpyReleasePending = TRUE;
|
||||||
hres = E_ACCESSDENIED;
|
hres = E_ACCESSDENIED;
|
||||||
|
|
|
@ -750,7 +750,7 @@ static HRESULT proxy_manager_construct(
|
||||||
|
|
||||||
EnterCriticalSection(&apt->cs);
|
EnterCriticalSection(&apt->cs);
|
||||||
/* FIXME: we are dependent on the ordering in here to make sure a proxy's
|
/* FIXME: we are dependent on the ordering in here to make sure a proxy's
|
||||||
* IRemUnknown proxy doesn't get destroyed before the regual proxy does
|
* IRemUnknown proxy doesn't get destroyed before the regular proxy does
|
||||||
* because we need the IRemUnknown proxy during the destruction of the
|
* because we need the IRemUnknown proxy during the destruction of the
|
||||||
* regular proxy. Ideally, we should maintain a separate list for the
|
* regular proxy. Ideally, we should maintain a separate list for the
|
||||||
* IRemUnknown proxies that need late destruction */
|
* IRemUnknown proxies that need late destruction */
|
||||||
|
@ -1760,7 +1760,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Calling IMarshal::MarshalInterace\n");
|
TRACE("Calling IMarshal::MarshalInterface\n");
|
||||||
/* call helper object to do the actual marshaling */
|
/* call helper object to do the actual marshaling */
|
||||||
hr = IMarshal_MarshalInterface(pMarshal, pStream, riid, pUnk, dwDestContext,
|
hr = IMarshal_MarshalInterface(pMarshal, pStream, riid, pUnk, dwDestContext,
|
||||||
pvDestContext, mshlFlags);
|
pvDestContext, mshlFlags);
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
|
#include "olestd.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(accel);
|
WINE_DECLARE_DEBUG_CHANNEL(accel);
|
||||||
|
|
||||||
|
@ -43,7 +45,6 @@ typedef struct tagTrackerWindowInfo
|
||||||
|
|
||||||
BOOL escPressed;
|
BOOL escPressed;
|
||||||
HWND curTargetHWND; /* window the mouse is hovering over */
|
HWND curTargetHWND; /* window the mouse is hovering over */
|
||||||
HWND curDragTargetHWND; /* might be an ancestor of curTargetHWND */
|
|
||||||
IDropTarget* curDragTarget;
|
IDropTarget* curDragTarget;
|
||||||
POINTL curMousePos; /* current position of the mouse in screen coordinates */
|
POINTL curMousePos; /* current position of the mouse in screen coordinates */
|
||||||
DWORD dwKeyState; /* current state of the shift and ctrl keys and the mouse buttons */
|
DWORD dwKeyState; /* current state of the shift and ctrl keys and the mouse buttons */
|
||||||
|
@ -745,7 +746,6 @@ HRESULT WINAPI DoDragDrop (
|
||||||
trackerInfo.pdwEffect = pdwEffect;
|
trackerInfo.pdwEffect = pdwEffect;
|
||||||
trackerInfo.trackingDone = FALSE;
|
trackerInfo.trackingDone = FALSE;
|
||||||
trackerInfo.escPressed = FALSE;
|
trackerInfo.escPressed = FALSE;
|
||||||
trackerInfo.curDragTargetHWND = 0;
|
|
||||||
trackerInfo.curTargetHWND = 0;
|
trackerInfo.curTargetHWND = 0;
|
||||||
trackerInfo.curDragTarget = 0;
|
trackerInfo.curDragTarget = 0;
|
||||||
|
|
||||||
|
@ -2158,6 +2158,96 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
||||||
return DefWindowProcW (hwnd, uMsg, wParam, lParam);
|
return DefWindowProcW (hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void drag_enter( TrackerWindowInfo *info, HWND new_target )
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
info->curTargetHWND = new_target;
|
||||||
|
|
||||||
|
while (new_target && !is_droptarget( new_target ))
|
||||||
|
new_target = GetParent( new_target );
|
||||||
|
|
||||||
|
info->curDragTarget = get_droptarget_pointer( new_target );
|
||||||
|
|
||||||
|
if (info->curDragTarget)
|
||||||
|
{
|
||||||
|
*info->pdwEffect = info->dwOKEffect;
|
||||||
|
hr = IDropTarget_DragEnter( info->curDragTarget, info->dataObject,
|
||||||
|
info->dwKeyState, info->curMousePos,
|
||||||
|
info->pdwEffect );
|
||||||
|
*info->pdwEffect &= info->dwOKEffect;
|
||||||
|
|
||||||
|
/* failed DragEnter() means invalid target */
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
IDropTarget_Release( info->curDragTarget );
|
||||||
|
info->curDragTarget = NULL;
|
||||||
|
info->curTargetHWND = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void drag_end( TrackerWindowInfo *info )
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
info->trackingDone = TRUE;
|
||||||
|
ReleaseCapture();
|
||||||
|
|
||||||
|
if (info->curDragTarget)
|
||||||
|
{
|
||||||
|
if (info->returnValue == DRAGDROP_S_DROP &&
|
||||||
|
*info->pdwEffect != DROPEFFECT_NONE)
|
||||||
|
{
|
||||||
|
*info->pdwEffect = info->dwOKEffect;
|
||||||
|
hr = IDropTarget_Drop( info->curDragTarget, info->dataObject, info->dwKeyState,
|
||||||
|
info->curMousePos, info->pdwEffect );
|
||||||
|
*info->pdwEffect &= info->dwOKEffect;
|
||||||
|
|
||||||
|
if (FAILED( hr ))
|
||||||
|
info->returnValue = hr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IDropTarget_DragLeave( info->curDragTarget );
|
||||||
|
*info->pdwEffect = DROPEFFECT_NONE;
|
||||||
|
}
|
||||||
|
IDropTarget_Release( info->curDragTarget );
|
||||||
|
info->curDragTarget = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*info->pdwEffect = DROPEFFECT_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT give_feedback( TrackerWindowInfo *info )
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
int res;
|
||||||
|
HCURSOR cur;
|
||||||
|
|
||||||
|
if (info->curDragTarget == NULL)
|
||||||
|
*info->pdwEffect = DROPEFFECT_NONE;
|
||||||
|
|
||||||
|
hr = IDropSource_GiveFeedback( info->dropSource, *info->pdwEffect );
|
||||||
|
|
||||||
|
if (hr == DRAGDROP_S_USEDEFAULTCURSORS)
|
||||||
|
{
|
||||||
|
if (*info->pdwEffect & DROPEFFECT_MOVE)
|
||||||
|
res = CURSOR_MOVE;
|
||||||
|
else if (*info->pdwEffect & DROPEFFECT_COPY)
|
||||||
|
res = CURSOR_COPY;
|
||||||
|
else if (*info->pdwEffect & DROPEFFECT_LINK)
|
||||||
|
res = CURSOR_LINK;
|
||||||
|
else
|
||||||
|
res = CURSOR_NODROP;
|
||||||
|
|
||||||
|
cur = LoadCursorW( hProxyDll, MAKEINTRESOURCEW( res ) );
|
||||||
|
SetCursor( cur );
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* OLEDD_TrackStateChange()
|
* OLEDD_TrackStateChange()
|
||||||
*
|
*
|
||||||
|
@ -2171,7 +2261,6 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
||||||
static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
||||||
{
|
{
|
||||||
HWND hwndNewTarget = 0;
|
HWND hwndNewTarget = 0;
|
||||||
HRESULT hr = S_OK;
|
|
||||||
POINT pt;
|
POINT pt;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2185,186 +2274,40 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
||||||
trackerInfo->escPressed,
|
trackerInfo->escPressed,
|
||||||
trackerInfo->dwKeyState);
|
trackerInfo->dwKeyState);
|
||||||
|
|
||||||
/*
|
if (trackerInfo->curTargetHWND != hwndNewTarget &&
|
||||||
* Every time, we re-initialize the effects passed to the
|
(trackerInfo->returnValue == S_OK ||
|
||||||
* IDropTarget to the effects allowed by the source.
|
trackerInfo->returnValue == DRAGDROP_S_DROP))
|
||||||
*/
|
|
||||||
*trackerInfo->pdwEffect = trackerInfo->dwOKEffect;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we are hovering over the same target as before, send the
|
|
||||||
* DragOver notification
|
|
||||||
*/
|
|
||||||
if ( (trackerInfo->curDragTarget != 0) &&
|
|
||||||
(trackerInfo->curTargetHWND == hwndNewTarget) )
|
|
||||||
{
|
{
|
||||||
|
if (trackerInfo->curDragTarget)
|
||||||
|
{
|
||||||
|
IDropTarget_DragLeave(trackerInfo->curDragTarget);
|
||||||
|
IDropTarget_Release(trackerInfo->curDragTarget);
|
||||||
|
trackerInfo->curDragTarget = NULL;
|
||||||
|
trackerInfo->curTargetHWND = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hwndNewTarget)
|
||||||
|
drag_enter( trackerInfo, hwndNewTarget );
|
||||||
|
|
||||||
|
give_feedback( trackerInfo );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trackerInfo->returnValue == S_OK)
|
||||||
|
{
|
||||||
|
if (trackerInfo->curDragTarget)
|
||||||
|
{
|
||||||
|
*trackerInfo->pdwEffect = trackerInfo->dwOKEffect;
|
||||||
IDropTarget_DragOver(trackerInfo->curDragTarget,
|
IDropTarget_DragOver(trackerInfo->curDragTarget,
|
||||||
trackerInfo->dwKeyState,
|
trackerInfo->dwKeyState,
|
||||||
trackerInfo->curMousePos,
|
trackerInfo->curMousePos,
|
||||||
trackerInfo->pdwEffect);
|
trackerInfo->pdwEffect);
|
||||||
*trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
|
*trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
|
||||||
}
|
}
|
||||||
else
|
give_feedback( trackerInfo );
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If we changed window, we have to notify our old target and check for
|
|
||||||
* the new one.
|
|
||||||
*/
|
|
||||||
if (trackerInfo->curDragTarget)
|
|
||||||
IDropTarget_DragLeave(trackerInfo->curDragTarget);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure we're hovering over a window.
|
|
||||||
*/
|
|
||||||
if (hwndNewTarget)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Find-out if there is a drag target under the mouse
|
|
||||||
*/
|
|
||||||
HWND next_target_wnd = hwndNewTarget;
|
|
||||||
|
|
||||||
trackerInfo->curTargetHWND = hwndNewTarget;
|
|
||||||
|
|
||||||
while (next_target_wnd && !is_droptarget(next_target_wnd))
|
|
||||||
next_target_wnd = GetParent(next_target_wnd);
|
|
||||||
|
|
||||||
if (next_target_wnd) hwndNewTarget = next_target_wnd;
|
|
||||||
|
|
||||||
trackerInfo->curDragTargetHWND = hwndNewTarget;
|
|
||||||
if(trackerInfo->curDragTarget) IDropTarget_Release(trackerInfo->curDragTarget);
|
|
||||||
trackerInfo->curDragTarget = get_droptarget_pointer(hwndNewTarget);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If there is, notify it that we just dragged-in
|
|
||||||
*/
|
|
||||||
if (trackerInfo->curDragTarget)
|
|
||||||
{
|
|
||||||
hr = IDropTarget_DragEnter(trackerInfo->curDragTarget,
|
|
||||||
trackerInfo->dataObject,
|
|
||||||
trackerInfo->dwKeyState,
|
|
||||||
trackerInfo->curMousePos,
|
|
||||||
trackerInfo->pdwEffect);
|
|
||||||
*trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
|
|
||||||
|
|
||||||
/* failed DragEnter() means invalid target */
|
|
||||||
if (hr != S_OK)
|
|
||||||
{
|
|
||||||
trackerInfo->curDragTargetHWND = 0;
|
|
||||||
trackerInfo->curTargetHWND = 0;
|
|
||||||
IDropTarget_Release(trackerInfo->curDragTarget);
|
|
||||||
trackerInfo->curDragTarget = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
drag_end( trackerInfo );
|
||||||
/*
|
|
||||||
* The mouse is not over a window so we don't track anything.
|
|
||||||
*/
|
|
||||||
trackerInfo->curDragTargetHWND = 0;
|
|
||||||
trackerInfo->curTargetHWND = 0;
|
|
||||||
if(trackerInfo->curDragTarget) IDropTarget_Release(trackerInfo->curDragTarget);
|
|
||||||
trackerInfo->curDragTarget = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now that we have done that, we have to tell the source to give
|
|
||||||
* us feedback on the work being done by the target. If we don't
|
|
||||||
* have a target, simulate no effect.
|
|
||||||
*/
|
|
||||||
if (trackerInfo->curDragTarget==0)
|
|
||||||
{
|
|
||||||
*trackerInfo->pdwEffect = DROPEFFECT_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = IDropSource_GiveFeedback(trackerInfo->dropSource,
|
|
||||||
*trackerInfo->pdwEffect);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When we ask for feedback from the drop source, sometimes it will
|
|
||||||
* do all the necessary work and sometimes it will not handle it
|
|
||||||
* when that's the case, we must display the standard drag and drop
|
|
||||||
* cursors.
|
|
||||||
*/
|
|
||||||
if (hr == DRAGDROP_S_USEDEFAULTCURSORS)
|
|
||||||
{
|
|
||||||
HCURSOR hCur;
|
|
||||||
|
|
||||||
if (*trackerInfo->pdwEffect & DROPEFFECT_MOVE)
|
|
||||||
{
|
|
||||||
hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(2));
|
|
||||||
}
|
|
||||||
else if (*trackerInfo->pdwEffect & DROPEFFECT_COPY)
|
|
||||||
{
|
|
||||||
hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(3));
|
|
||||||
}
|
|
||||||
else if (*trackerInfo->pdwEffect & DROPEFFECT_LINK)
|
|
||||||
{
|
|
||||||
hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(4));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCursor(hCur);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All the return valued will stop the operation except the S_OK
|
|
||||||
* return value.
|
|
||||||
*/
|
|
||||||
if (trackerInfo->returnValue!=S_OK)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Make sure the message loop in DoDragDrop stops
|
|
||||||
*/
|
|
||||||
trackerInfo->trackingDone = TRUE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Release the mouse in case the drop target decides to show a popup
|
|
||||||
* or a menu or something.
|
|
||||||
*/
|
|
||||||
ReleaseCapture();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we end-up over a target, drop the object in the target or
|
|
||||||
* inform the target that the operation was cancelled.
|
|
||||||
*/
|
|
||||||
if (trackerInfo->curDragTarget)
|
|
||||||
{
|
|
||||||
switch (trackerInfo->returnValue)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If the source wants us to complete the operation, we tell
|
|
||||||
* the drop target that we just dropped the object in it.
|
|
||||||
*/
|
|
||||||
case DRAGDROP_S_DROP:
|
|
||||||
if (*trackerInfo->pdwEffect != DROPEFFECT_NONE)
|
|
||||||
{
|
|
||||||
hr = IDropTarget_Drop(trackerInfo->curDragTarget, trackerInfo->dataObject,
|
|
||||||
trackerInfo->dwKeyState, trackerInfo->curMousePos, trackerInfo->pdwEffect);
|
|
||||||
if (FAILED(hr))
|
|
||||||
trackerInfo->returnValue = hr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
IDropTarget_DragLeave(trackerInfo->curDragTarget);
|
|
||||||
break;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the source told us that we should cancel, fool the drop
|
|
||||||
* target by telling it that the mouse left its window.
|
|
||||||
* Also set the drop effect to "NONE" in case the application
|
|
||||||
* ignores the result of DoDragDrop.
|
|
||||||
*/
|
|
||||||
case DRAGDROP_S_CANCEL:
|
|
||||||
IDropTarget_DragLeave(trackerInfo->curDragTarget);
|
|
||||||
*trackerInfo->pdwEffect = DROPEFFECT_NONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
|
|
|
@ -74,12 +74,3 @@ HRESULT WINAPI CoGetCallerTID(LPDWORD lpdwTID)
|
||||||
FIXME("stub!\n");
|
FIXME("stub!\n");
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* CoGetCurrentLogicalThreadId [OLE32.@]
|
|
||||||
*/
|
|
||||||
HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *pguid)
|
|
||||||
{
|
|
||||||
FIXME(": stub\n");
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,30 @@
|
||||||
diff -prudN e:\wine\dlls\ole32/compobj.c dll\win32\ole32/compobj.c
|
diff -pudN e:\wine\dlls\ole32/comcat.c e:\reactos\dll\win32\ole32/comcat.c
|
||||||
--- e:\wine\dlls\ole32/compobj.c 2015-02-21 17:13:09.561542200 +0100
|
--- e:\wine\dlls\ole32/comcat.c 2016-05-31 18:02:11 +0100
|
||||||
+++ dll\win32\ole32/compobj.c 2015-02-28 13:26:29.259662000 +0100
|
+++ e:\reactos\dll\win32\ole32/comcat.c 2016-03-04 10:20:45 +0100
|
||||||
@@ -331,8 +304,12 @@ static NTSTATUS create_key( HKEY *retkey
|
@@ -229,7 +229,11 @@ static HRESULT COMCAT_IsClassOfCategorie
|
||||||
|
if (res != ERROR_SUCCESS) return S_FALSE;
|
||||||
|
for (string = impl_strings; *string; string += CHARS_IN_GUID) {
|
||||||
|
HKEY catkey;
|
||||||
|
+#ifdef __REACTOS__
|
||||||
|
res = open_classes_key(subkey, string, READ_CONTROL, &catkey);
|
||||||
|
+#else
|
||||||
|
+ res = open_classes_key(subkey, string, 0, &catkey);
|
||||||
|
+#endif
|
||||||
|
if (res != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(subkey);
|
||||||
|
return S_FALSE;
|
||||||
|
diff -pudN e:\wine\dlls\ole32/compobj.c e:\reactos\dll\win32\ole32/compobj.c
|
||||||
|
--- e:\wine\dlls\ole32/compobj.c 2016-05-31 18:02:11 +0100
|
||||||
|
+++ e:\reactos\dll\win32\ole32/compobj.c 2016-06-07 11:34:16 +0100
|
||||||
|
@@ -43,6 +43,7 @@
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
|
||||||
|
+#undef ARRAYSIZE
|
||||||
|
#define ARRAYSIZE(array) (sizeof(array)/sizeof((array)[0]))
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
@@ -303,9 +304,13 @@ static NTSTATUS create_key( HKEY *retkey
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,52 +32,63 @@ diff -prudN e:\wine\dlls\ole32/compobj.c dll\win32\ole32/compobj.c
|
||||||
+static const WCHAR classes_rootW[] = L"\\REGISTRY\\Machine\\Software\\Classes";
|
+static const WCHAR classes_rootW[] = L"\\REGISTRY\\Machine\\Software\\Classes";
|
||||||
+#else
|
+#else
|
||||||
static const WCHAR classes_rootW[] =
|
static const WCHAR classes_rootW[] =
|
||||||
{'M','a','c','h','i','n','e','\\','S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s',0};
|
{'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e',
|
||||||
|
'\\','S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s',0};
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
static HKEY classes_root_hkey;
|
static HKEY classes_root_hkey;
|
||||||
|
|
||||||
diff -prudN e:\wine\dlls\ole32/stg_prop.c dll\win32\ole32/stg_prop.c
|
diff -pudN e:\wine\dlls\ole32/stg_prop.c e:\reactos\dll\win32\ole32/stg_prop.c
|
||||||
--- e:\wine\dlls\ole32/stg_prop.c 2015-02-21 17:13:09.569542200 +0100
|
--- e:\wine\dlls\ole32/stg_prop.c 2016-05-31 18:02:11 +0100
|
||||||
+++ dll\win32\ole32/stg_prop.c 2014-04-08 19:21:32.097336500 +0100
|
+++ e:\reactos\dll\win32\ole32/stg_prop.c 2016-06-07 11:34:17 +0100
|
||||||
@@ -1035,12 +1018,12 @@ static HRESULT PropertyStorage_ReadDicti
|
@@ -41,6 +41,10 @@
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(storage);
|
||||||
|
|
||||||
|
+#ifdef _MSC_VER
|
||||||
|
+#define __ASM_STDCALL_FUNC(name,args,code)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static inline StorageImpl *impl_from_IPropertySetStorage( IPropertySetStorage *iface )
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, StorageImpl, base.IPropertySetStorage_iface);
|
||||||
|
@@ -1013,7 +1017,13 @@ static HRESULT PropertyStorage_ReadDicti
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __i386__
|
-static void* WINAPI Allocate_CoTaskMemAlloc(void *this, ULONG size)
|
||||||
-#define __thiscall __stdcall
|
+#ifdef __i386__
|
||||||
+#define __thiscall_wrapper __stdcall
|
+#define __thiscall_wrapper __stdcall
|
||||||
#else
|
+#else
|
||||||
-#define __thiscall __cdecl
|
|
||||||
+#define __thiscall_wrapper __cdecl
|
+#define __thiscall_wrapper __cdecl
|
||||||
#endif
|
+#endif
|
||||||
|
+
|
||||||
-static __thiscall void* Allocate_CoTaskMemAlloc(void *userdata, ULONG size)
|
+static void* __thiscall_wrapper Allocate_CoTaskMemAlloc(void *this, ULONG size)
|
||||||
+static void* __thiscall_wrapper Allocate_CoTaskMemAlloc(void *userdata, ULONG size)
|
|
||||||
{
|
{
|
||||||
return CoTaskMemAlloc(size);
|
return CoTaskMemAlloc(size);
|
||||||
}
|
}
|
||||||
@@ -1049,7 +1032,7 @@ static __thiscall void* Allocate_CoTaskM
|
@@ -1022,7 +1032,7 @@ static void* WINAPI Allocate_CoTaskMemAl
|
||||||
* end of the buffer.
|
* end of the buffer.
|
||||||
*/
|
*/
|
||||||
static HRESULT PropertyStorage_ReadProperty(PROPVARIANT *prop, const BYTE *data,
|
static HRESULT PropertyStorage_ReadProperty(PROPVARIANT *prop, const BYTE *data,
|
||||||
- UINT codepage, void* (__thiscall *allocate)(void *userdata, ULONG size), void *allocate_data)
|
- UINT codepage, void* (WINAPI *allocate)(void *this, ULONG size), void *allocate_data)
|
||||||
+ UINT codepage, void* (__thiscall_wrapper *allocate)(void *userdata, ULONG size), void *allocate_data)
|
+ UINT codepage, void* (__thiscall_wrapper *allocate)(void *this, ULONG size), void *allocate_data)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
|
|
||||||
@@ -2738,13 +2721,13 @@ end:
|
@@ -2711,13 +2721,13 @@ end:
|
||||||
"jmp *(4*(" #num "))(%eax)" )
|
"jmp *(4*(" #num "))(%eax)" )
|
||||||
|
|
||||||
DEFINE_STDCALL_WRAPPER(0,Allocate_PMemoryAllocator,8)
|
DEFINE_STDCALL_WRAPPER(0,Allocate_PMemoryAllocator,8)
|
||||||
-extern void* __thiscall Allocate_PMemoryAllocator(void *this, ULONG cbSize);
|
-extern void* WINAPI Allocate_PMemoryAllocator(void *this, ULONG cbSize);
|
||||||
+extern void* __stdcall Allocate_PMemoryAllocator(void *this, ULONG cbSize);
|
+extern void* __stdcall Allocate_PMemoryAllocator(void *this, ULONG cbSize);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
-static void* __thiscall Allocate_PMemoryAllocator(void *this, ULONG cbSize)
|
-static void* WINAPI Allocate_PMemoryAllocator(void *this, ULONG cbSize)
|
||||||
+static void* __cdecl Allocate_PMemoryAllocator(void *this, ULONG cbSize)
|
+static void* __cdecl Allocate_PMemoryAllocator(void *this, ULONG cbSize)
|
||||||
{
|
{
|
||||||
- void* (__thiscall *fn)(void*,ULONG) = **(void***)this;
|
- void* (WINAPI *fn)(void*,ULONG) = **(void***)this;
|
||||||
+ void* (__cdecl *fn)(void*,ULONG) = **(void***)this;
|
+ void* (__cdecl *fn)(void*,ULONG) = **(void***)this;
|
||||||
return fn(this, cbSize);
|
return fn(this, cbSize);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
//#include "winuser.h"
|
//#include "winuser.h"
|
||||||
//#include "winnls.h"
|
//#include "winnls.h"
|
||||||
|
|
||||||
|
#include "olestd.h"
|
||||||
|
|
||||||
#define WINE_FILENAME_STR "ole32.dll"
|
#define WINE_FILENAME_STR "ole32.dll"
|
||||||
#define WINE_EXTRAVALUES VALUE "OLESelfRegister",""
|
#define WINE_EXTRAVALUES VALUE "OLESelfRegister",""
|
||||||
|
|
||||||
|
@ -37,15 +39,15 @@
|
||||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
|
|
||||||
/* @makedep: nodrop.cur */
|
/* @makedep: nodrop.cur */
|
||||||
1 CURSOR nodrop.cur
|
CURSOR_NODROP CURSOR nodrop.cur
|
||||||
|
|
||||||
/* @makedep: drag_move.cur */
|
/* @makedep: drag_move.cur */
|
||||||
2 CURSOR drag_move.cur
|
CURSOR_MOVE CURSOR drag_move.cur
|
||||||
|
|
||||||
/* @makedep: drag_copy.cur */
|
/* @makedep: drag_copy.cur */
|
||||||
3 CURSOR drag_copy.cur
|
CURSOR_COPY CURSOR drag_copy.cur
|
||||||
|
|
||||||
/* @makedep: drag_link.cur */
|
/* @makedep: drag_link.cur */
|
||||||
4 CURSOR drag_link.cur
|
CURSOR_LINK CURSOR drag_link.cur
|
||||||
|
|
||||||
1 WINE_REGISTRY "ole32.rgs"
|
1 WINE_REGISTRY "ole32.rgs"
|
||||||
|
|
|
@ -49,4 +49,9 @@
|
||||||
#define OleStdCopyMetafilePict(hpictin, phpictout) \
|
#define OleStdCopyMetafilePict(hpictin, phpictout) \
|
||||||
(*(phpictout) = OleDuplicateData(hpictin,CF_METAFILEPICT,GHND|GMEM_SHARE))
|
(*(phpictout) = OleDuplicateData(hpictin,CF_METAFILEPICT,GHND|GMEM_SHARE))
|
||||||
|
|
||||||
|
#define CURSOR_NODROP 1
|
||||||
|
#define CURSOR_MOVE 2
|
||||||
|
#define CURSOR_COPY 3
|
||||||
|
#define CURSOR_LINK 4
|
||||||
|
|
||||||
#endif /* __WINE_OLESTD_H_ */
|
#endif /* __WINE_OLESTD_H_ */
|
||||||
|
|
|
@ -2053,12 +2053,12 @@ static HRESULT PropertyStorage_BaseConstruct(IStream *stm,
|
||||||
hr = PropertyStorage_CreateDictionaries(*pps);
|
hr = PropertyStorage_CreateDictionaries(*pps);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
IStream_Release(stm);
|
|
||||||
(*pps)->cs.DebugInfo->Spare[0] = 0;
|
(*pps)->cs.DebugInfo->Spare[0] = 0;
|
||||||
DeleteCriticalSection(&(*pps)->cs);
|
DeleteCriticalSection(&(*pps)->cs);
|
||||||
HeapFree(GetProcessHeap(), 0, *pps);
|
HeapFree(GetProcessHeap(), 0, *pps);
|
||||||
*pps = NULL;
|
*pps = NULL;
|
||||||
}
|
}
|
||||||
|
else IStream_AddRef( stm );
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -2080,11 +2080,7 @@ static HRESULT PropertyStorage_ConstructFromStream(IStream *stm,
|
||||||
TRACE("PropertyStorage %p constructed\n", ps);
|
TRACE("PropertyStorage %p constructed\n", ps);
|
||||||
hr = S_OK;
|
hr = S_OK;
|
||||||
}
|
}
|
||||||
else
|
else IPropertyStorage_Release( &ps->IPropertyStorage_iface );
|
||||||
{
|
|
||||||
PropertyStorage_DestroyDictionaries(ps);
|
|
||||||
HeapFree(GetProcessHeap(), 0, ps);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -2212,6 +2208,8 @@ static HRESULT WINAPI IPropertySetStorage_fnCreate(
|
||||||
|
|
||||||
r = PropertyStorage_ConstructEmpty(stm, rfmtid, grfFlags, grfMode, ppprstg);
|
r = PropertyStorage_ConstructEmpty(stm, rfmtid, grfFlags, grfMode, ppprstg);
|
||||||
|
|
||||||
|
IStream_Release( stm );
|
||||||
|
|
||||||
end:
|
end:
|
||||||
TRACE("returning 0x%08x\n", r);
|
TRACE("returning 0x%08x\n", r);
|
||||||
return r;
|
return r;
|
||||||
|
@ -2257,6 +2255,8 @@ static HRESULT WINAPI IPropertySetStorage_fnOpen(
|
||||||
|
|
||||||
r = PropertyStorage_ConstructFromStream(stm, rfmtid, grfMode, ppprstg);
|
r = PropertyStorage_ConstructFromStream(stm, rfmtid, grfMode, ppprstg);
|
||||||
|
|
||||||
|
IStream_Release( stm );
|
||||||
|
|
||||||
end:
|
end:
|
||||||
TRACE("returning 0x%08x\n", r);
|
TRACE("returning 0x%08x\n", r);
|
||||||
return r;
|
return r;
|
||||||
|
@ -2757,3 +2757,93 @@ SERIALIZEDPROPERTYVALUE* WINAPI StgConvertVariantToProperty(const PROPVARIANT *p
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI StgCreatePropStg(IUnknown *unk, REFFMTID fmt, const CLSID *clsid,
|
||||||
|
DWORD flags, DWORD reserved, IPropertyStorage **prop_stg)
|
||||||
|
{
|
||||||
|
IStorage *stg;
|
||||||
|
IStream *stm;
|
||||||
|
HRESULT r;
|
||||||
|
|
||||||
|
TRACE("%p %s %s %08x %d %p\n", unk, debugstr_guid(fmt), debugstr_guid(clsid), flags, reserved, prop_stg);
|
||||||
|
|
||||||
|
if (!fmt || reserved)
|
||||||
|
{
|
||||||
|
r = E_INVALIDARG;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & PROPSETFLAG_NONSIMPLE)
|
||||||
|
{
|
||||||
|
r = IUnknown_QueryInterface(unk, &IID_IStorage, (void **)&stg);
|
||||||
|
if (FAILED(r))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
/* FIXME: if (flags & PROPSETFLAG_NONSIMPLE), we need to create a
|
||||||
|
* storage, not a stream. For now, disallow it.
|
||||||
|
*/
|
||||||
|
FIXME("PROPSETFLAG_NONSIMPLE not supported\n");
|
||||||
|
IStorage_Release(stg);
|
||||||
|
r = STG_E_INVALIDFLAG;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r = IUnknown_QueryInterface(unk, &IID_IStream, (void **)&stm);
|
||||||
|
if (FAILED(r))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
r = PropertyStorage_ConstructEmpty(stm, fmt, flags,
|
||||||
|
STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, prop_stg);
|
||||||
|
|
||||||
|
IStream_Release( stm );
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
TRACE("returning 0x%08x\n", r);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI StgOpenPropStg(IUnknown *unk, REFFMTID fmt, DWORD flags,
|
||||||
|
DWORD reserved, IPropertyStorage **prop_stg)
|
||||||
|
{
|
||||||
|
IStorage *stg;
|
||||||
|
IStream *stm;
|
||||||
|
HRESULT r;
|
||||||
|
|
||||||
|
TRACE("%p %s %08x %d %p\n", unk, debugstr_guid(fmt), flags, reserved, prop_stg);
|
||||||
|
|
||||||
|
if (!fmt || reserved)
|
||||||
|
{
|
||||||
|
r = E_INVALIDARG;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & PROPSETFLAG_NONSIMPLE)
|
||||||
|
{
|
||||||
|
r = IUnknown_QueryInterface(unk, &IID_IStorage, (void **)&stg);
|
||||||
|
if (FAILED(r))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
/* FIXME: if (flags & PROPSETFLAG_NONSIMPLE), we need to open a
|
||||||
|
* storage, not a stream. For now, disallow it.
|
||||||
|
*/
|
||||||
|
FIXME("PROPSETFLAG_NONSIMPLE not supported\n");
|
||||||
|
IStorage_Release(stg);
|
||||||
|
r = STG_E_INVALIDFLAG;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r = IUnknown_QueryInterface(unk, &IID_IStream, (void **)&stm);
|
||||||
|
if (FAILED(r))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
r = PropertyStorage_ConstructFromStream(stm, fmt,
|
||||||
|
STGM_READWRITE|STGM_SHARE_EXCLUSIVE, prop_stg);
|
||||||
|
|
||||||
|
IStream_Release( stm );
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
TRACE("returning 0x%08x\n", r);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
|
@ -142,7 +142,7 @@ reactos/dll/win32/ntprint # Synced to WineStaging-1.9.4
|
||||||
reactos/dll/win32/objsel # Synced to WineStaging-1.9.4
|
reactos/dll/win32/objsel # Synced to WineStaging-1.9.4
|
||||||
reactos/dll/win32/odbc32 # Synced to WineStaging-1.9.4. Depends on port of Linux ODBC.
|
reactos/dll/win32/odbc32 # Synced to WineStaging-1.9.4. Depends on port of Linux ODBC.
|
||||||
reactos/dll/win32/odbccp32 # Synced to WineStaging-1.9.4
|
reactos/dll/win32/odbccp32 # Synced to WineStaging-1.9.4
|
||||||
reactos/dll/win32/ole32 # Synced to WineStaging-1.9.4
|
reactos/dll/win32/ole32 # Synced to WineStaging-1.9.11
|
||||||
reactos/dll/win32/oleacc # Synced to WineStaging-1.9.4
|
reactos/dll/win32/oleacc # Synced to WineStaging-1.9.4
|
||||||
reactos/dll/win32/oleaut32 # Synced to WineStaging-1.9.4
|
reactos/dll/win32/oleaut32 # Synced to WineStaging-1.9.4
|
||||||
reactos/dll/win32/olecli32 # Synced to WineStaging-1.9.4
|
reactos/dll/win32/olecli32 # Synced to WineStaging-1.9.4
|
||||||
|
|
Loading…
Reference in a new issue