diff --git a/reactos/dll/win32/shell32/defcontextmenu.cpp b/reactos/dll/win32/shell32/defcontextmenu.cpp index 94863d7f35a..db24a4c17a2 100644 --- a/reactos/dll/win32/shell32/defcontextmenu.cpp +++ b/reactos/dll/win32/shell32/defcontextmenu.cpp @@ -1144,18 +1144,17 @@ CDefaultContextMenu::DoCreateLink( HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi) { TRACE("(%p) Deleting\n", this); - LPDATAOBJECT pDataObj; + CComPtr 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 diff --git a/reactos/dll/win32/shell32/folders/fs.cpp b/reactos/dll/win32/shell32/folders/fs.cpp index ef16c7b41af..2bd8b9124eb 100644 --- a/reactos/dll/win32/shell32/folders/fs.cpp +++ b/reactos/dll/win32/shell32/folders/fs.cpp @@ -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; } diff --git a/reactos/dll/win32/shell32/folders/recyclebin.cpp b/reactos/dll/win32/shell32/folders/recyclebin.cpp index 4365297b7d0..18982fb072e 100644 --- a/reactos/dll/win32/shell32/folders/recyclebin.cpp +++ b/reactos/dll/win32/shell32/folders/recyclebin.cpp @@ -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 pDataObject; + HRESULT hr = CoGetInterfaceAndReleaseStream (static_cast(lpParameter), IID_PPV_ARG(IDataObject, &pDataObject)); + if (SUCCEEDED(hr)) + { + DoDeleteDataObject(pDataObject); + } + CoUninitialize(); return 0; }