Author: akhaldi
Date: Tue Jun 7 10:47:21 2016
New Revision: 71579
URL:
http://svn.reactos.org/svn/reactos?rev=71579&view=rev
Log:
[OLE32] Sync with Wine Staging 1.9.11. CORE-11368
Modified:
trunk/reactos/dll/win32/ole32/compobj.c
trunk/reactos/dll/win32/ole32/compositemoniker.c
trunk/reactos/dll/win32/ole32/datacache.c
trunk/reactos/dll/win32/ole32/filemoniker.c
trunk/reactos/dll/win32/ole32/ifs.c
trunk/reactos/dll/win32/ole32/marshal.c
trunk/reactos/dll/win32/ole32/ole2.c
trunk/reactos/dll/win32/ole32/ole2stubs.c
trunk/reactos/dll/win32/ole32/ole32_ros.diff
trunk/reactos/dll/win32/ole32/ole32res.rc
trunk/reactos/dll/win32/ole32/olestd.h
trunk/reactos/dll/win32/ole32/stg_prop.c
trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/win32/ole32/compobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/compobj.c?…
==============================================================================
--- trunk/reactos/dll/win32/ole32/compobj.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/compobj.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -3181,14 +3181,14 @@
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;
for (i = 0; i < count; i++)
{
mqi[i].pItf = NULL;
- mqi[i].hr = E_NOINTERFACE;
+ mqi[i].hr = hr;
}
}
@@ -3244,7 +3244,7 @@
if (pServerInfo)
FIXME("() non-NULL pServerInfo not supported!\n");
- init_multi_qi(cmq, pResults);
+ init_multi_qi(cmq, pResults, E_NOINTERFACE);
hres = CoGetTreatAsClass(rclsid, &clsid);
if(FAILED(hres))
@@ -3328,7 +3328,7 @@
if (server_info)
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 */
if (!rclsid)
@@ -3350,20 +3350,30 @@
(void**)&unk);
if (hr != S_OK)
- return hr;
+ {
+ init_multi_qi(count, results, hr);
+ return hr;
+ }
/* init from file */
hr = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&pf);
if (FAILED(hr))
- ERR("failed to get IPersistFile\n");
-
- if (pf)
{
- IPersistFile_Load(pf, filename, grfmode);
- IPersistFile_Release(pf);
+ init_multi_qi(count, results, hr);
+ IUnknown_Release(unk);
+ return hr;
}
- return return_multi_qi(unk, count, results, FALSE);
+ hr = IPersistFile_Load(pf, filename, grfmode);
+ IPersistFile_Release(pf);
+ if (SUCCEEDED(hr))
+ return return_multi_qi(unk, count, results, FALSE);
+ else
+ {
+ init_multi_qi(count, results, hr);
+ IUnknown_Release(unk);
+ return hr;
+ }
}
/***********************************************************************
@@ -3390,7 +3400,7 @@
if (server_info)
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 */
if (!rclsid)
@@ -3826,6 +3836,20 @@
DWORD WINAPI CoGetCurrentProcess(void)
{
return GetCurrentProcessId();
+}
+
+/***********************************************************************
+ * CoGetCurrentLogicalThreadId [OLE32.@]
+ */
+HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *id)
+{
+ TRACE("(%p)\n", id);
+
+ if (!id)
+ return E_INVALIDARG;
+
+ *id = COM_CurrentCausalityId();
+ return S_OK;
}
/******************************************************************************
@@ -4595,7 +4619,6 @@
IContextCallback IContextCallback_iface;
IObjContext IObjContext_iface;
LONG refs;
- APTTYPE apttype;
} Context;
static inline Context *impl_from_IComThreadingInfo( IComThreadingInfo *iface )
@@ -4648,10 +4671,15 @@
static ULONG Context_Release(Context *This)
{
- ULONG refs = InterlockedDecrement(&This->refs);
- if (!refs)
+ /* Context instance is initially created with CoGetContextToken() with refcount set
to 0,
+ releasing context while refcount is at 0 destroys it. */
+ if (!This->refs)
+ {
HeapFree(GetProcessHeap(), 0, This);
- return refs;
+ return 0;
+ }
+
+ return InterlockedDecrement(&This->refs);
}
static HRESULT WINAPI Context_CTI_QueryInterface(IComThreadingInfo *iface, REFIID riid,
LPVOID *ppv)
@@ -4674,21 +4702,26 @@
static HRESULT WINAPI Context_CTI_GetCurrentApartmentType(IComThreadingInfo *iface,
APTTYPE *apttype)
{
- Context *This = impl_from_IComThreadingInfo(iface);
+ APTTYPEQUALIFIER qualifier;
TRACE("(%p)\n", apttype);
- *apttype = This->apttype;
- return S_OK;
+ return CoGetApartmentType(apttype, &qualifier);
}
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);
- switch (This->apttype)
+ switch (apttype)
{
case APTTYPE_STA:
case APTTYPE_MAINSTA:
@@ -4703,8 +4736,8 @@
static HRESULT WINAPI Context_CTI_GetCurrentLogicalThreadId(IComThreadingInfo *iface,
GUID *logical_thread_id)
{
- FIXME("(%p): stub\n", logical_thread_id);
- return E_NOTIMPL;
+ TRACE("(%p)\n", logical_thread_id);
+ return CoGetCurrentLogicalThreadId(logical_thread_id);
}
static HRESULT WINAPI Context_CTI_SetCurrentLogicalThreadId(IComThreadingInfo *iface,
REFGUID logical_thread_id)
@@ -4884,44 +4917,18 @@
*/
HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
{
- APARTMENT *apt = COM_CurrentApt();
- Context *context;
+ IObjContext *context;
HRESULT hr;
TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
*ppv = NULL;
- if (!apt)
- {
- 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;
-}
-
+ hr = CoGetContextToken((ULONG_PTR*)&context);
+ if (FAILED(hr))
+ return hr;
+
+ return IObjContext_QueryInterface(context, riid, ppv);
+}
/***********************************************************************
* CoGetContextToken [OLE32.@]
@@ -4951,16 +4958,24 @@
if (!info->context_token)
{
- HRESULT hr;
- IObjContext *ctx;
-
- hr = CoGetObjectContext(&IID_IObjContext, (void **)&ctx);
- if (FAILED(hr)) return hr;
- info->context_token = ctx;
+ Context *context;
+
+ 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 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;
- TRACE("apt->context_token=%p\n", info->context_token);
+ TRACE("context_token=%p\n", info->context_token);
return S_OK;
}
@@ -5013,7 +5028,7 @@
{
struct oletls *info = COM_CurrentInfo();
- FIXME("(%p %p): semi-stub\n", type, qualifier);
+ FIXME("(%p, %p): semi-stub\n", type, qualifier);
if (!type || !qualifier)
return E_INVALIDARG;
@@ -5032,7 +5047,7 @@
*qualifier = APTTYPEQUALIFIER_NONE;
- return info->apt ? ERROR_SUCCESS : CO_E_NOTINITIALIZED;
+ return info->apt ? S_OK : CO_E_NOTINITIALIZED;
}
/***********************************************************************
Modified: trunk/reactos/dll/win32/ole32/compositemoniker.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/compositem…
==============================================================================
--- trunk/reactos/dll/win32/ole32/compositemoniker.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/compositemoniker.c [iso-8859-1] Tue Jun 7 10:47:21
2016
@@ -64,7 +64,7 @@
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
@@ -320,7 +320,7 @@
{
HRESULT res;
IRunningObjectTable *prot;
- IMoniker *tempMk,*antiMk,*mostRigthMk;
+ IMoniker *tempMk,*antiMk,*rightMostMk;
IEnumMoniker *enumMoniker;
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
@@ -349,17 +349,17 @@
/* component of the composite, passing the rest of the composite as the pmkToLeft
parameter for that call */
IMoniker_Enum(iface,FALSE,&enumMoniker);
- IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+ IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
IEnumMoniker_Release(enumMoniker);
res=CreateAntiMoniker(&antiMk);
res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
- res=IMoniker_BindToObject(mostRigthMk,pbc,tempMk,riid,ppvResult);
+ res=IMoniker_BindToObject(rightMostMk,pbc,tempMk,riid,ppvResult);
IMoniker_Release(tempMk);
- IMoniker_Release(mostRigthMk);
+ IMoniker_Release(rightMostMk);
}
return res;
@@ -373,7 +373,7 @@
IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
{
HRESULT res;
- IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk;
+ IMoniker *tempMk,*antiMk,*rightMostMk,*leftMk;
IEnumMoniker *enumMoniker;
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
@@ -392,7 +392,7 @@
leftMk = iface;
IMoniker_Enum(iface, FALSE, &enumMoniker);
- IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL);
+ IEnumMoniker_Next(enumMoniker, 1, &rightMostMk, NULL);
IEnumMoniker_Release(enumMoniker);
res = CreateAntiMoniker(&antiMk);
@@ -401,11 +401,11 @@
if (FAILED(res)) return res;
IMoniker_Release(antiMk);
- res = IMoniker_BindToStorage(mostRigthMk, pbc, tempMk, riid, ppvResult);
+ res = IMoniker_BindToStorage(rightMostMk, pbc, tempMk, riid, ppvResult);
IMoniker_Release(tempMk);
- IMoniker_Release(mostRigthMk);
+ IMoniker_Release(rightMostMk);
if (pmkToLeft)
IMoniker_Release(leftMk);
@@ -420,7 +420,7 @@
CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
{
- IMoniker *tempMk,*antiMk,*mostRigthMk,*leftReducedComposedMk,*mostRigthReducedMk;
+ IMoniker *tempMk,*antiMk,*rightMostMk,*leftReducedComposedMk,*rightMostReducedMk;
IEnumMoniker *enumMoniker;
TRACE("(%p,%p,%d,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
@@ -433,14 +433,14 @@
if (ppmkToLeft==NULL){
IMoniker_Enum(iface,FALSE,&enumMoniker);
- IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+ IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
IEnumMoniker_Release(enumMoniker);
CreateAntiMoniker(&antiMk);
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
- return IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
+ return IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
}
else if (*ppmkToLeft==NULL)
@@ -450,7 +450,7 @@
/* separate the composite moniker in to left and right moniker */
IMoniker_Enum(iface,FALSE,&enumMoniker);
- IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+ IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
IEnumMoniker_Release(enumMoniker);
CreateAntiMoniker(&antiMk);
@@ -459,11 +459,11 @@
/* If any of the components reduces itself, the method returns S_OK and passes
back a composite */
/* of the reduced components */
- if (IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,NULL,&mostRigthReducedMk)
&&
-
IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk)
+ if (IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,NULL,&rightMostReducedMk)
&&
+
IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk)
)
- return
CreateGenericComposite(leftReducedComposedMk,mostRigthReducedMk,ppmkReduced);
+ return
CreateGenericComposite(leftReducedComposedMk,rightMostReducedMk,ppmkReduced);
else{
/* If no reduction occurred, the method passes back the same moniker and
returns MK_S_REDUCED_TO_SELF.*/
@@ -613,7 +613,7 @@
{
IRunningObjectTable* rot;
HRESULT res;
- IMoniker *tempMk,*antiMk,*mostRigthMk;
+ IMoniker *tempMk,*antiMk,*rightMostMk;
IEnumMoniker *enumMoniker;
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
@@ -665,17 +665,17 @@
else{
IMoniker_Enum(iface,FALSE,&enumMoniker);
- IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+ IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
IEnumMoniker_Release(enumMoniker);
res=CreateAntiMoniker(&antiMk);
res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
- res=IMoniker_IsRunning(mostRigthMk,pbc,tempMk,pmkNewlyRunning);
+ res=IMoniker_IsRunning(rightMostMk,pbc,tempMk,pmkNewlyRunning);
IMoniker_Release(tempMk);
- IMoniker_Release(mostRigthMk);
+ IMoniker_Release(rightMostMk);
return res;
}
@@ -690,7 +690,7 @@
IMoniker* pmkToLeft, FILETIME* pCompositeTime)
{
HRESULT res;
- IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk;
+ IMoniker *tempMk,*antiMk,*rightMostMk,*leftMk;
IEnumMoniker *enumMoniker;
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pCompositeTime);
@@ -727,17 +727,17 @@
leftMk = iface;
IMoniker_Enum(iface, FALSE, &enumMoniker);
- IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL);
+ IEnumMoniker_Next(enumMoniker, 1, &rightMostMk, NULL);
IEnumMoniker_Release(enumMoniker);
res = CreateAntiMoniker(&antiMk);
res = IMoniker_ComposeWith(leftMk, antiMk, 0, &tempMk);
IMoniker_Release(antiMk);
- res = IMoniker_GetTimeOfLastChange(mostRigthMk, pbc, tempMk, pCompositeTime);
+ res = IMoniker_GetTimeOfLastChange(rightMostMk, pbc, tempMk, pCompositeTime);
IMoniker_Release(tempMk);
- IMoniker_Release(mostRigthMk);
+ IMoniker_Release(rightMostMk);
if (pmkToLeft)
IMoniker_Release(leftMk);
@@ -752,7 +752,7 @@
CompositeMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
{
HRESULT res;
- IMoniker *tempMk,*antiMk,*mostRigthMk,*tempInvMk,*mostRigthInvMk;
+ IMoniker *tempMk,*antiMk,*rightMostMk,*tempInvMk,*rightMostInvMk;
IEnumMoniker *enumMoniker;
TRACE("(%p,%p)\n",iface,ppmk);
@@ -781,18 +781,18 @@
else{
IMoniker_Enum(iface,FALSE,&enumMoniker);
- IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+ IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
IEnumMoniker_Release(enumMoniker);
- IMoniker_Inverse(mostRigthMk,&mostRigthInvMk);
+ IMoniker_Inverse(rightMostMk,&rightMostInvMk);
CompositeMonikerImpl_Inverse(tempMk,&tempInvMk);
- res=CreateGenericComposite(mostRigthInvMk,tempInvMk,ppmk);
+ res=CreateGenericComposite(rightMostInvMk,tempInvMk,ppmk);
IMoniker_Release(tempMk);
- IMoniker_Release(mostRigthMk);
+ IMoniker_Release(rightMostMk);
IMoniker_Release(tempInvMk);
- IMoniker_Release(mostRigthInvMk);
+ IMoniker_Release(rightMostInvMk);
return res;
}
@@ -1140,13 +1140,13 @@
IMoniker** ppmkOut)
{
IEnumMoniker *enumMoniker;
- IMoniker *tempMk,*mostRigthMk,*antiMk;
+ IMoniker *tempMk,*rightMostMk,*antiMk;
/* This method recursively calls IMoniker::ParseDisplayName on the rightmost
component of the composite,*/
/* passing everything else as the pmkToLeft parameter for that call. */
/* get the most right moniker */
IMoniker_Enum(iface,FALSE,&enumMoniker);
- IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+ IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
IEnumMoniker_Release(enumMoniker);
/* get the left moniker */
@@ -1154,7 +1154,7 @@
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
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 @@
IMoniker *tempMk;
HRESULT res;
CompositeMonikerImpl *This;
+ int i;
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
@@ -1787,12 +1788,14 @@
if (++This->tabLastIndex==This->tabSize){
- LPVOID tab_moniker = This->tabMoniker;
+ IMoniker **tab_moniker = This->tabMoniker;
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){
+ for (i = 0; i < This->tabLastIndex; i++)
+ IMoniker_Release(tab_moniker[i]);
HeapFree(GetProcessHeap(), 0, tab_moniker);
HeapFree(GetProcessHeap(), 0, This);
return E_OUTOFMEMORY;
@@ -1835,18 +1838,25 @@
IMoniker_Release(This->tabMoniker[This->tabLastIndex-1]);
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;
+ }
/* resize tabMoniker if needed */
if (This->tabLastIndex==This->tabSize){
- LPVOID tab_moniker = This->tabMoniker;
+ IMoniker **tab_moniker = This->tabMoniker;
This->tabSize+=BLOCK_TAB_SIZE;
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(IMoniker));
if (This->tabMoniker==NULL){
+ for (i = 0; i < This->tabLastIndex; i++)
+ IMoniker_Release(tab_moniker[i]);
HeapFree(GetProcessHeap(), 0, tab_moniker);
HeapFree(GetProcessHeap(), 0, This);
return E_OUTOFMEMORY;
@@ -1883,13 +1893,15 @@
}
if (This->tabLastIndex==This->tabSize){
- LPVOID tab_moniker = This->tabMoniker;
+ IMoniker **tab_moniker = This->tabMoniker;
This->tabSize+=BLOCK_TAB_SIZE;
This->tabMoniker=HeapReAlloc(GetProcessHeap(),0,This->tabMoniker,This->tabSize*sizeof(This->tabMoniker[0]));
if (This->tabMoniker==NULL){
+ for (i = 0; i < This->tabLastIndex; i++)
+ IMoniker_Release(tab_moniker[i]);
HeapFree(GetProcessHeap(), 0, tab_moniker);
HeapFree(GetProcessHeap(), 0, This);
return E_OUTOFMEMORY;
Modified: trunk/reactos/dll/win32/ole32/datacache.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/datacache.…
==============================================================================
--- trunk/reactos/dll/win32/ole32/datacache.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/datacache.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -2450,7 +2450,7 @@
* IUnknown pointer can be returned to the outside.
*/
if ( pUnkOuter && !IsEqualIID(&IID_IUnknown, riid) )
- return CLASS_E_NOAGGREGATION;
+ return E_INVALIDARG;
/*
* Try to construct a new instance of the class.
Modified: trunk/reactos/dll/win32/ole32/filemoniker.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/filemonike…
==============================================================================
--- trunk/reactos/dll/win32/ole32/filemoniker.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/filemoniker.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -678,39 +678,39 @@
lastIdx2=FileMonikerImpl_DecomposePath(str2,&strDec2)-1;
if ((lastIdx1==-1 && lastIdx2>-1)||(lastIdx1==1 &&
lstrcmpW(strDec1[0],twoPoint)==0))
- return MK_E_SYNTAX;
-
- if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0)
- lastIdx1--;
-
- /* for etch "..\" 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){
-
- lastIdx1-=2;
- }
-
- /* the length of the composed path string is raised by the sum of the two paths
lengths */
-
newStr=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(str1)+lstrlenW(str2)+1));
-
- if (newStr)
- {
- /* new path is the concatenation of the rest of str1 and str2 */
- for(*newStr=0,j=0;j<=lastIdx1;j++)
- strcatW(newStr,strDec1[j]);
-
- if ((strDec2[i]==NULL && lastIdx1>-1 && lastIdx2>-1) ||
lstrcmpW(strDec2[i],bkSlash)!=0)
- strcatW(newStr,bkSlash);
-
- for(j=i;j<=lastIdx2;j++)
- strcatW(newStr,strDec2[j]);
-
- /* create a new moniker with the new string */
- res=CreateFileMoniker(newStr,ppmkComposite);
-
- /* free all strings space memory used by this function */
- HeapFree(GetProcessHeap(),0,newStr);
- }
- else res = E_OUTOFMEMORY;
+ res = MK_E_SYNTAX;
+ else{
+ if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0)
+ lastIdx1--;
+
+ /* 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){
+
+ lastIdx1-=2;
+ }
+
+ /* 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));
+
+ if (newStr){
+ /* new path is the concatenation of the rest of str1 and str2 */
+ for(*newStr=0,j=0;j<=lastIdx1;j++)
+ strcatW(newStr,strDec1[j]);
+
+ if ((strDec2[i]==NULL && lastIdx1>-1 &&
lastIdx2>-1) || lstrcmpW(strDec2[i],bkSlash)!=0)
+ strcatW(newStr,bkSlash);
+
+ for(j=i;j<=lastIdx2;j++)
+ strcatW(newStr,strDec2[j]);
+
+ /* create a new moniker with the new string */
+ res=CreateFileMoniker(newStr,ppmkComposite);
+
+ /* free string memory used by this function */
+ HeapFree(GetProcessHeap(),0,newStr);
+ }
+ else res = E_OUTOFMEMORY;
+ }
free_stringtable(strDec1);
free_stringtable(strDec2);
Modified: trunk/reactos/dll/win32/ole32/ifs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/ifs.c?rev=…
==============================================================================
--- trunk/reactos/dll/win32/ole32/ifs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/ifs.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -448,13 +448,15 @@
IMallocSpy* pSpy;
HRESULT hres = E_INVALIDARG;
- TRACE("\n");
-
- if(Malloc32.pSpy) return CO_E_OBJISREG;
+ TRACE("%p\n", pMallocSpy);
+
+ if(!pMallocSpy) return E_INVALIDARG;
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;
hres = S_OK;
}
@@ -488,7 +490,9 @@
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);
Malloc32.SpyReleasePending = TRUE;
hres = E_ACCESSDENIED;
Modified: trunk/reactos/dll/win32/ole32/marshal.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/marshal.c?…
==============================================================================
--- trunk/reactos/dll/win32/ole32/marshal.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/marshal.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -750,7 +750,7 @@
EnterCriticalSection(&apt->cs);
/* 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
* regular proxy. Ideally, we should maintain a separate list for the
* IRemUnknown proxies that need late destruction */
@@ -1760,7 +1760,7 @@
}
}
- TRACE("Calling IMarshal::MarshalInterace\n");
+ TRACE("Calling IMarshal::MarshalInterface\n");
/* call helper object to do the actual marshaling */
hr = IMarshal_MarshalInterface(pMarshal, pStream, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags);
Modified: trunk/reactos/dll/win32/ole32/ole2.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/ole2.c?rev…
==============================================================================
--- trunk/reactos/dll/win32/ole32/ole2.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/ole2.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -25,6 +25,8 @@
#include "precomp.h"
+#include "olestd.h"
+
WINE_DEFAULT_DEBUG_CHANNEL(ole);
WINE_DECLARE_DEBUG_CHANNEL(accel);
@@ -43,7 +45,6 @@
BOOL escPressed;
HWND curTargetHWND; /* window the mouse is hovering over */
- HWND curDragTargetHWND; /* might be an ancestor of curTargetHWND */
IDropTarget* curDragTarget;
POINTL curMousePos; /* current position of the mouse in screen coordinates
*/
DWORD dwKeyState; /* current state of the shift and ctrl keys and the mouse
buttons */
@@ -745,7 +746,6 @@
trackerInfo.pdwEffect = pdwEffect;
trackerInfo.trackingDone = FALSE;
trackerInfo.escPressed = FALSE;
- trackerInfo.curDragTargetHWND = 0;
trackerInfo.curTargetHWND = 0;
trackerInfo.curDragTarget = 0;
@@ -2158,6 +2158,96 @@
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()
*
@@ -2171,7 +2261,6 @@
static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
{
HWND hwndNewTarget = 0;
- HRESULT hr = S_OK;
POINT pt;
/*
@@ -2185,186 +2274,40 @@
trackerInfo->escPressed,
trackerInfo->dwKeyState);
- /*
- * Every time, we re-initialize the effects passed to the
- * IDropTarget to the effects allowed by the source.
- */
- *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) )
- {
- IDropTarget_DragOver(trackerInfo->curDragTarget,
- trackerInfo->dwKeyState,
- trackerInfo->curMousePos,
- trackerInfo->pdwEffect);
- *trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
+ if (trackerInfo->curTargetHWND != hwndNewTarget &&
+ (trackerInfo->returnValue == S_OK ||
+ trackerInfo->returnValue == DRAGDROP_S_DROP))
+ {
+ 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,
+ trackerInfo->dwKeyState,
+ trackerInfo->curMousePos,
+ trackerInfo->pdwEffect);
+ *trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
+ }
+ give_feedback( trackerInfo );
}
else
- {
- /*
- * 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
- {
- /*
- * 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;
- }
- }
- }
+ drag_end( trackerInfo );
}
/***
Modified: trunk/reactos/dll/win32/ole32/ole2stubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/ole2stubs.…
==============================================================================
--- trunk/reactos/dll/win32/ole32/ole2stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/ole2stubs.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -74,12 +74,3 @@
FIXME("stub!\n");
return E_NOTIMPL;
}
-
-/***********************************************************************
- * CoGetCurrentLogicalThreadId [OLE32.@]
- */
-HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *pguid)
-{
- FIXME(": stub\n");
- return E_NOTIMPL;
-}
Modified: trunk/reactos/dll/win32/ole32/ole32_ros.diff
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/ole32_ros.…
==============================================================================
--- trunk/reactos/dll/win32/ole32/ole32_ros.diff [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/ole32_ros.diff [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -1,7 +1,30 @@
-diff -prudN e:\wine\dlls\ole32/compobj.c dll\win32\ole32/compobj.c
---- e:\wine\dlls\ole32/compobj.c 2015-02-21 17:13:09.561542200 +0100
-+++ dll\win32\ole32/compobj.c 2015-02-28 13:26:29.259662000 +0100
-@@ -331,8 +304,12 @@ static NTSTATUS create_key( HKEY *retkey
+diff -pudN e:\wine\dlls\ole32/comcat.c e:\reactos\dll\win32\ole32/comcat.c
+--- e:\wine\dlls\ole32/comcat.c 2016-05-31 18:02:11 +0100
++++ e:\reactos\dll\win32\ole32/comcat.c 2016-03-04 10:20:45 +0100
+@@ -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;
}
@@ -9,52 +32,63 @@
+static const WCHAR classes_rootW[] =
L"\\REGISTRY\\Machine\\Software\\Classes";
+#else
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
static HKEY classes_root_hkey;
-diff -prudN e:\wine\dlls\ole32/stg_prop.c dll\win32\ole32/stg_prop.c
---- e:\wine\dlls\ole32/stg_prop.c 2015-02-21 17:13:09.569542200 +0100
-+++ dll\win32\ole32/stg_prop.c 2014-04-08 19:21:32.097336500 +0100
-@@ -1035,12 +1018,12 @@ static HRESULT PropertyStorage_ReadDicti
+diff -pudN e:\wine\dlls\ole32/stg_prop.c e:\reactos\dll\win32\ole32/stg_prop.c
+--- e:\wine\dlls\ole32/stg_prop.c 2016-05-31 18:02:11 +0100
++++ e:\reactos\dll\win32\ole32/stg_prop.c 2016-06-07 11:34:17 +0100
+@@ -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__
--#define __thiscall __stdcall
+-static void* WINAPI Allocate_CoTaskMemAlloc(void *this, ULONG size)
++#ifdef __i386__
+#define __thiscall_wrapper __stdcall
- #else
--#define __thiscall __cdecl
++#else
+#define __thiscall_wrapper __cdecl
- #endif
-
--static __thiscall void* Allocate_CoTaskMemAlloc(void *userdata, ULONG size)
-+static void* __thiscall_wrapper Allocate_CoTaskMemAlloc(void *userdata, ULONG size)
++#endif
++
++static void* __thiscall_wrapper Allocate_CoTaskMemAlloc(void *this, ULONG 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.
*/
static HRESULT PropertyStorage_ReadProperty(PROPVARIANT *prop, const BYTE *data,
-- UINT codepage, void* (__thiscall *allocate)(void *userdata, ULONG size), void
*allocate_data)
-+ UINT codepage, void* (__thiscall_wrapper *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 *this, ULONG size), void
*allocate_data)
{
HRESULT hr = S_OK;
-@@ -2738,13 +2721,13 @@ end:
+@@ -2711,13 +2721,13 @@ end:
"jmp *(4*(" #num "))(%eax)" )
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);
#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)
{
-- void* (__thiscall *fn)(void*,ULONG) = **(void***)this;
+- void* (WINAPI *fn)(void*,ULONG) = **(void***)this;
+ void* (__cdecl *fn)(void*,ULONG) = **(void***)this;
return fn(this, cbSize);
}
Modified: trunk/reactos/dll/win32/ole32/ole32res.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/ole32res.r…
==============================================================================
--- trunk/reactos/dll/win32/ole32/ole32res.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/ole32res.rc [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -23,6 +23,8 @@
//#include "winuser.h"
//#include "winnls.h"
+#include "olestd.h"
+
#define WINE_FILENAME_STR "ole32.dll"
#define WINE_EXTRAVALUES VALUE "OLESelfRegister",""
@@ -37,15 +39,15 @@
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
/* @makedep: nodrop.cur */
-1 CURSOR nodrop.cur
+CURSOR_NODROP CURSOR nodrop.cur
/* @makedep: drag_move.cur */
-2 CURSOR drag_move.cur
+CURSOR_MOVE CURSOR drag_move.cur
/* @makedep: drag_copy.cur */
-3 CURSOR drag_copy.cur
+CURSOR_COPY CURSOR drag_copy.cur
/* @makedep: drag_link.cur */
-4 CURSOR drag_link.cur
+CURSOR_LINK CURSOR drag_link.cur
1 WINE_REGISTRY "ole32.rgs"
Modified: trunk/reactos/dll/win32/ole32/olestd.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/olestd.h?r…
==============================================================================
--- trunk/reactos/dll/win32/ole32/olestd.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/olestd.h [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -49,4 +49,9 @@
#define OleStdCopyMetafilePict(hpictin, phpictout) \
(*(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_ */
Modified: trunk/reactos/dll/win32/ole32/stg_prop.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/stg_prop.c…
==============================================================================
--- trunk/reactos/dll/win32/ole32/stg_prop.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/stg_prop.c [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -2053,12 +2053,12 @@
hr = PropertyStorage_CreateDictionaries(*pps);
if (FAILED(hr))
{
- IStream_Release(stm);
(*pps)->cs.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&(*pps)->cs);
HeapFree(GetProcessHeap(), 0, *pps);
*pps = NULL;
}
+ else IStream_AddRef( stm );
return hr;
}
@@ -2080,11 +2080,7 @@
TRACE("PropertyStorage %p constructed\n", ps);
hr = S_OK;
}
- else
- {
- PropertyStorage_DestroyDictionaries(ps);
- HeapFree(GetProcessHeap(), 0, ps);
- }
+ else IPropertyStorage_Release( &ps->IPropertyStorage_iface );
}
return hr;
}
@@ -2212,6 +2208,8 @@
r = PropertyStorage_ConstructEmpty(stm, rfmtid, grfFlags, grfMode, ppprstg);
+ IStream_Release( stm );
+
end:
TRACE("returning 0x%08x\n", r);
return r;
@@ -2256,6 +2254,8 @@
goto end;
r = PropertyStorage_ConstructFromStream(stm, rfmtid, grfMode, ppprstg);
+
+ IStream_Release( stm );
end:
TRACE("returning 0x%08x\n", r);
@@ -2757,3 +2757,93 @@
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;
+}
Modified: trunk/reactos/media/doc/README.WINE
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=…
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Tue Jun 7 10:47:21 2016
@@ -142,7 +142,7 @@
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/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/oleaut32 # Synced to WineStaging-1.9.4
reactos/dll/win32/olecli32 # Synced to WineStaging-1.9.4