mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[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:
parent
bd13d223c5
commit
3decbe052b
3 changed files with 17 additions and 12 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue