[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) { HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi) {
TRACE("(%p) Deleting\n", this); 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(); IStream *s;
SHCreateThread(DoDeleteThreadProc, pDataObj, NULL, NULL); CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &s);
pDataObj->Release(); SHCreateThread(DoDeleteThreadProc, s, NULL, NULL);
} }
else else
return E_FAIL; return E_FAIL;
return S_OK; return S_OK;
} }
HRESULT HRESULT

View file

@ -1763,6 +1763,7 @@ DWORD WINAPI CFSFolder::_DoDropThreadProc(LPVOID lpParameter) {
data->This->Release(); data->This->Release();
//Release the parameter from the heap. //Release the parameter from the heap.
HeapFree(GetProcessHeap(), 0, data); HeapFree(GetProcessHeap(), 0, data);
CoUninitialize();
return 0; 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 */ /* Handle cfShellIDList Drop objects here, otherwise send the approriate message to other software */
if (SUCCEEDED(pDataObject->QueryGetData(&fmt))) { if (SUCCEEDED(pDataObject->QueryGetData(&fmt))) {
pDataObject->AddRef(); IStream *s;
SHCreateThread(DoDeleteThreadProc, pDataObject, NULL, NULL); CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &s);
SHCreateThread(DoDeleteThreadProc, s, NULL, NULL);
} }
else else
{ {
@ -1474,10 +1475,14 @@ HRESULT WINAPI CRecycleBin::Drop(IDataObject *pDataObject,
DWORD WINAPI DoDeleteThreadProc(LPVOID lpParameter) DWORD WINAPI DoDeleteThreadProc(LPVOID lpParameter)
{ {
IDataObject *pda = (IDataObject*) lpParameter; CoInitialize(NULL);
DoDeleteDataObject(pda); CComPtr<IDataObject> pDataObject;
//Release the data object HRESULT hr = CoGetInterfaceAndReleaseStream (static_cast<IStream*>(lpParameter), IID_PPV_ARG(IDataObject, &pDataObject));
pda->Release(); if (SUCCEEDED(hr))
{
DoDeleteDataObject(pDataObject);
}
CoUninitialize();
return 0; return 0;
} }