[SHELL32]

Marshall interface pointers during background delete by Huw Campbell
CORE-8460 #resolve #comment Committed by request of Victor. Have fun ^^

svn path=/trunk/; revision=63932
This commit is contained in:
Daniel Reimer 2014-08-24 13:25:12 +00:00
parent bd13d223c5
commit 3decbe052b
3 changed files with 17 additions and 12 deletions

View file

@ -1144,18 +1144,17 @@ CDefaultContextMenu::DoCreateLink(
HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi) {
TRACE("(%p) Deleting\n", this);
LPDATAOBJECT pDataObj;
CComPtr<IDataObject> pDataObject;
if (SUCCEEDED(SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj))))
if (SUCCEEDED(SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObject))))
{
pDataObj->AddRef();
SHCreateThread(DoDeleteThreadProc, pDataObj, NULL, NULL);
pDataObj->Release();
IStream *s;
CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &s);
SHCreateThread(DoDeleteThreadProc, s, NULL, NULL);
}
else
return E_FAIL;
return S_OK;
}
HRESULT

View file

@ -1763,6 +1763,7 @@ DWORD WINAPI CFSFolder::_DoDropThreadProc(LPVOID lpParameter) {
data->This->Release();
//Release the parameter from the heap.
HeapFree(GetProcessHeap(), 0, data);
CoUninitialize();
return 0;
}

View file

@ -1459,8 +1459,9 @@ HRESULT WINAPI CRecycleBin::Drop(IDataObject *pDataObject,
/* Handle cfShellIDList Drop objects here, otherwise send the approriate message to other software */
if (SUCCEEDED(pDataObject->QueryGetData(&fmt))) {
pDataObject->AddRef();
SHCreateThread(DoDeleteThreadProc, pDataObject, NULL, NULL);
IStream *s;
CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &s);
SHCreateThread(DoDeleteThreadProc, s, NULL, NULL);
}
else
{
@ -1474,10 +1475,14 @@ HRESULT WINAPI CRecycleBin::Drop(IDataObject *pDataObject,
DWORD WINAPI DoDeleteThreadProc(LPVOID lpParameter)
{
IDataObject *pda = (IDataObject*) lpParameter;
DoDeleteDataObject(pda);
//Release the data object
pda->Release();
CoInitialize(NULL);
CComPtr<IDataObject> pDataObject;
HRESULT hr = CoGetInterfaceAndReleaseStream (static_cast<IStream*>(lpParameter), IID_PPV_ARG(IDataObject, &pDataObject));
if (SUCCEEDED(hr))
{
DoDeleteDataObject(pDataObject);
}
CoUninitialize();
return 0;
}