ole32: Use helper function to duplicate global memory.

This commit is contained in:
Huw Davies 2009-04-16 12:06:29 +01:00 committed by Alexandre Julliard
parent 469d6ea2df
commit 5defc71dfe
1 changed files with 8 additions and 25 deletions

View File

@ -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;
} }