Huw Davies : ole32: Use helper function to duplicate global memory.

Alexandre Julliard julliard at winehq.org
Thu Apr 16 14:34:49 CDT 2009


Module: wine
Branch: master
Commit: 5defc71dfe8a77b533bba2d116511d381267e2f5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5defc71dfe8a77b533bba2d116511d381267e2f5

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Apr 16 12:06:29 2009 +0100

ole32: Use helper function to duplicate global memory.

---

 dlls/ole32/clipboard.c |   33 ++++++++-------------------------
 1 files changed, 8 insertions(+), 25 deletions(-)

diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c
index 5b58a23..4bcce37 100644
--- a/dlls/ole32/clipboard.c
+++ b/dlls/ole32/clipboard.c
@@ -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
  */
-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;
     DWORD size;
@@ -414,7 +414,7 @@ static HRESULT dup_global_mem( HGLOBAL src, HGLOBAL *dst )
 
     size = GlobalSize(src);
 
-    *dst = GlobalAlloc( GMEM_DDESHARE|GMEM_MOVEABLE, size );
+    *dst = GlobalAlloc( flags, size );
     if ( !*dst ) return E_OUTOFMEMORY;
 
     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);
     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;
 
@@ -918,9 +918,9 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_GetData(
 	    LPFORMATETC      pformatetcIn,
 	    STGMEDIUM*       pmedium)
 {
-  HANDLE      hData = 0;
-  LPVOID src;
+  HANDLE h, hData = 0;
   ole_clipbrd *This = impl_from_IDataObject(iface);
+  HRESULT hr;
 
   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;
 
-  hData = GetClipboardData(pformatetcIn->cfFormat);
-
-  /* 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;
-  }
+  h = GetClipboardData(pformatetcIn->cfFormat);
+  hr = dup_global_mem(h, GMEM_MOVEABLE, &hData);
 
   /*
    * 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(FAILED(hr)) return hr;
   return (hData == 0) ? DV_E_FORMATETC : S_OK;
 }
 




More information about the wine-cvs mailing list