ole32: Use helper function to duplicate global memory.
This commit is contained in:
parent
469d6ea2df
commit
5defc71dfe
|
@ -404,7 +404,7 @@ static HRESULT enum_fmtetc_construct(ole_priv_data *data, UINT pos, IEnumFORMATE
|
||||||
*
|
*
|
||||||
* Helper method to duplicate an HGLOBAL chunk of memory
|
* Helper method to duplicate an HGLOBAL chunk of memory
|
||||||
*/
|
*/
|
||||||
static HRESULT dup_global_mem( HGLOBAL src, HGLOBAL *dst )
|
static HRESULT dup_global_mem( HGLOBAL src, DWORD flags, HGLOBAL *dst )
|
||||||
{
|
{
|
||||||
void *src_ptr, *dst_ptr;
|
void *src_ptr, *dst_ptr;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
@ -414,7 +414,7 @@ static HRESULT dup_global_mem( HGLOBAL src, HGLOBAL *dst )
|
||||||
|
|
||||||
size = GlobalSize(src);
|
size = GlobalSize(src);
|
||||||
|
|
||||||
*dst = GlobalAlloc( GMEM_DDESHARE|GMEM_MOVEABLE, size );
|
*dst = GlobalAlloc( flags, size );
|
||||||
if ( !*dst ) return E_OUTOFMEMORY;
|
if ( !*dst ) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
src_ptr = GlobalLock(src);
|
src_ptr = GlobalLock(src);
|
||||||
|
@ -685,7 +685,7 @@ static HRESULT get_data_from_global(IDataObject *data, FORMATETC *fmt, HGLOBAL *
|
||||||
hr = IDataObject_GetData(data, &mem_fmt, &med);
|
hr = IDataObject_GetData(data, &mem_fmt, &med);
|
||||||
if(FAILED(hr)) return hr;
|
if(FAILED(hr)) return hr;
|
||||||
|
|
||||||
hr = dup_global_mem(med.u.hGlobal, &h);
|
hr = dup_global_mem(med.u.hGlobal, GMEM_DDESHARE|GMEM_MOVEABLE, &h);
|
||||||
|
|
||||||
if(SUCCEEDED(hr)) *mem = h;
|
if(SUCCEEDED(hr)) *mem = h;
|
||||||
|
|
||||||
|
@ -918,9 +918,9 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_GetData(
|
||||||
LPFORMATETC pformatetcIn,
|
LPFORMATETC pformatetcIn,
|
||||||
STGMEDIUM* pmedium)
|
STGMEDIUM* pmedium)
|
||||||
{
|
{
|
||||||
HANDLE hData = 0;
|
HANDLE h, hData = 0;
|
||||||
LPVOID src;
|
|
||||||
ole_clipbrd *This = impl_from_IDataObject(iface);
|
ole_clipbrd *This = impl_from_IDataObject(iface);
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p)\n", iface, pformatetcIn, pmedium);
|
TRACE("(%p,%p,%p)\n", iface, pformatetcIn, pmedium);
|
||||||
|
|
||||||
|
@ -953,26 +953,8 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_GetData(
|
||||||
*/
|
*/
|
||||||
if ( !OpenClipboard(theOleClipboard->hWndClipboard)) return CLIPBRD_E_CANT_OPEN;
|
if ( !OpenClipboard(theOleClipboard->hWndClipboard)) return CLIPBRD_E_CANT_OPEN;
|
||||||
|
|
||||||
hData = GetClipboardData(pformatetcIn->cfFormat);
|
h = GetClipboardData(pformatetcIn->cfFormat);
|
||||||
|
hr = dup_global_mem(h, GMEM_MOVEABLE, &hData);
|
||||||
/* Must make a copy of global handle returned by GetClipboardData; it
|
|
||||||
* is not valid after we call CloseClipboard
|
|
||||||
* Application is responsible for freeing the memory (Forte Agent does this)
|
|
||||||
*/
|
|
||||||
src = GlobalLock(hData);
|
|
||||||
if(src) {
|
|
||||||
LPVOID dest;
|
|
||||||
ULONG size;
|
|
||||||
HANDLE hDest;
|
|
||||||
|
|
||||||
size = GlobalSize(hData);
|
|
||||||
hDest = GlobalAlloc(GHND, size);
|
|
||||||
dest = GlobalLock(hDest);
|
|
||||||
memcpy(dest, src, size);
|
|
||||||
GlobalUnlock(hDest);
|
|
||||||
GlobalUnlock(hData);
|
|
||||||
hData = hDest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the clipboard data in the storage medium structure
|
* Return the clipboard data in the storage medium structure
|
||||||
|
@ -983,6 +965,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_GetData(
|
||||||
|
|
||||||
if ( !CloseClipboard() ) return CLIPBRD_E_CANT_CLOSE;
|
if ( !CloseClipboard() ) return CLIPBRD_E_CANT_CLOSE;
|
||||||
|
|
||||||
|
if(FAILED(hr)) return hr;
|
||||||
return (hData == 0) ? DV_E_FORMATETC : S_OK;
|
return (hData == 0) ? DV_E_FORMATETC : S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue