mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 13:05:44 +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) {
|
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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue