[OLE32] Sync with Wine Staging 1.9.11. CORE-11368

svn path=/trunk/; revision=71579
This commit is contained in:
Amine Khaldi 2016-06-07 10:47:21 +00:00
parent 76e295bbed
commit 3df7653ebe
13 changed files with 456 additions and 360 deletions

View file

@ -3181,14 +3181,14 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(
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 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstanceEx(
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 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(
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 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(
(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 @@ HRESULT WINAPI CoGetInstanceFromIStorage(
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)
@ -3828,6 +3838,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;
}
/******************************************************************************
* CoRegisterMessageFilter [OLE32.@]
*
@ -4595,7 +4619,6 @@ typedef struct Context
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_AddRef(Context *This)
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 ULONG WINAPI Context_CTI_Release(IComThreadingInfo *iface)
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_GetCurrentThreadType(IComThreadingInfo *iface,
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,45 +4917,19 @@ static const IObjContextVtbl Context_Object_Vtbl =
*/
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);
}
hr = CoGetContextToken((ULONG_PTR*)&context);
if (FAILED(hr))
return hr;
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 IObjContext_QueryInterface(context, riid, ppv);
}
/***********************************************************************
* CoGetContextToken [OLE32.@]
*/
@ -4951,16 +4958,24 @@ HRESULT WINAPI CoGetContextToken( ULONG_PTR *token )
if (!info->context_token)
{
HRESULT hr;
IObjContext *ctx;
Context *context;
hr = CoGetObjectContext(&IID_IObjContext, (void **)&ctx);
if (FAILED(hr)) return hr;
info->context_token = ctx;
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 @@ HRESULT WINAPI CoGetApartmentType(APTTYPE *type, APTTYPEQUALIFIER *qualifier)
{
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 @@ HRESULT WINAPI CoGetApartmentType(APTTYPE *type, APTTYPEQUALIFIER *qualifier)
*qualifier = APTTYPEQUALIFIER_NONE;
return info->apt ? ERROR_SUCCESS : CO_E_NOTINITIALIZED;
return info->apt ? S_OK : CO_E_NOTINITIALIZED;
}
/***********************************************************************

View file

@ -64,7 +64,7 @@ static inline EnumMonikerImpl *impl_from_IEnumMoniker(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
@ -320,7 +320,7 @@ CompositeMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc,
{
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 @@ CompositeMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc,
/* 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 @@ CompositeMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc,
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 @@ CompositeMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc,
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 @@ CompositeMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc,
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 @@ static HRESULT WINAPI
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 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
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 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
/* 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 @@ 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 */
/* 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 @@ CompositeMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc,
{
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 @@ CompositeMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc,
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 @@ CompositeMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc,
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 @@ CompositeMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc,
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 @@ static HRESULT WINAPI
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 @@ CompositeMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
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 @@ CompositeMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc,
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 @@ CompositeMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc,
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 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
IMoniker *tempMk;
HRESULT res;
CompositeMonikerImpl *This;
int i;
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
@ -1787,12 +1788,14 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
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 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
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 @@ CompositeMonikerImpl_Construct(IMoniker **ppMoniker, IMoniker *pmkFirst, IMonike
}
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;

View file

@ -2450,7 +2450,7 @@ HRESULT WINAPI CreateDataCache(
* 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.

View file

@ -678,40 +678,40 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
lastIdx2=FileMonikerImpl_DecomposePath(str2,&strDec2)-1;
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)
lastIdx1--;
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){
/* 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;
}
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;
}
/* 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;
free_stringtable(strDec1);
free_stringtable(strDec2);

View file

@ -448,13 +448,15 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy)
IMallocSpy* pSpy;
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);
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 @@ HRESULT WINAPI CoRevokeMallocSpy(void)
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;

View file

@ -750,7 +750,7 @@ static HRESULT proxy_manager_construct(
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 @@ 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 */
hr = IMarshal_MarshalInterface(pMarshal, pStream, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags);

View file

@ -25,6 +25,8 @@
#include "precomp.h"
#include "olestd.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);
WINE_DECLARE_DEBUG_CHANNEL(accel);
@ -43,7 +45,6 @@ typedef struct tagTrackerWindowInfo
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 @@ HRESULT WINAPI DoDragDrop (
trackerInfo.pdwEffect = pdwEffect;
trackerInfo.trackingDone = FALSE;
trackerInfo.escPressed = FALSE;
trackerInfo.curDragTargetHWND = 0;
trackerInfo.curTargetHWND = 0;
trackerInfo.curDragTarget = 0;
@ -2158,6 +2158,96 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
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 LRESULT WINAPI OLEDD_DragTrackerWindowProc(
static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
{
HWND hwndNewTarget = 0;
HRESULT hr = S_OK;
POINT pt;
/*
@ -2185,186 +2274,40 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
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) )
if (trackerInfo->curTargetHWND != hwndNewTarget &&
(trackerInfo->returnValue == S_OK ||
trackerInfo->returnValue == DRAGDROP_S_DROP))
{
IDropTarget_DragOver(trackerInfo->curDragTarget,
trackerInfo->dwKeyState,
trackerInfo->curMousePos,
trackerInfo->pdwEffect);
*trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
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 );
}
/***

View file

@ -74,12 +74,3 @@ HRESULT WINAPI CoGetCallerTID(LPDWORD lpdwTID)
FIXME("stub!\n");
return E_NOTIMPL;
}
/***********************************************************************
* CoGetCurrentLogicalThreadId [OLE32.@]
*/
HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *pguid)
{
FIXME(": stub\n");
return E_NOTIMPL;
}

View file

@ -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 @@ diff -prudN e:\wine\dlls\ole32/compobj.c dll\win32\ole32/compobj.c
+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);
}

View file

@ -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"

View file

@ -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_ */

View file

@ -2053,12 +2053,12 @@ static HRESULT PropertyStorage_BaseConstruct(IStream *stm,
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 @@ static HRESULT PropertyStorage_ConstructFromStream(IStream *stm,
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 @@ static HRESULT WINAPI IPropertySetStorage_fnCreate(
r = PropertyStorage_ConstructEmpty(stm, rfmtid, grfFlags, grfMode, ppprstg);
IStream_Release( stm );
end:
TRACE("returning 0x%08x\n", r);
return r;
@ -2257,6 +2255,8 @@ static HRESULT WINAPI IPropertySetStorage_fnOpen(
r = PropertyStorage_ConstructFromStream(stm, rfmtid, grfMode, ppprstg);
IStream_Release( stm );
end:
TRACE("returning 0x%08x\n", r);
return r;
@ -2757,3 +2757,93 @@ SERIALIZEDPROPERTYVALUE* WINAPI StgConvertVariantToProperty(const PROPVARIANT *p
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;
}

View file

@ -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/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