| Update of /cvsroot/pywin32/pywin32/com/win32com/src/extensions
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1796/extensions
Modified Files:
	PyIDataObject.cpp PySTGMEDIUM.cpp 
Log Message:
Correctly copy the STGMEDIUM data to the new STGMEDIUM, and not just
the pointers.
Index: PySTGMEDIUM.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/extensions/PySTGMEDIUM.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** PySTGMEDIUM.cpp	26 Apr 2004 00:17:58 -0000	1.4
--- PySTGMEDIUM.cpp	12 Jun 2004 13:31:50 -0000	1.5
***************
*** 136,139 ****
--- 136,196 ----
  }
  
+ BOOL PySTGMEDIUM::CopyTo(STGMEDIUM *pDest)
+ {
+ 	assert(pDest->tymed==0);
+ 	switch (medium.tymed) {
+ 		// we can't just copy these handles, and there is no easy way I see
+ 		// to generically duplicate them.  There is a CopyStgMedium function,
+ 		// but is part of IE, not of OLE.
+ 		case TYMED_GDI:
+ 			PyErr_SetString(PyExc_ValueError, "don't know how to copy these objects");
+ 			return FALSE;
+ 			// is it ok to just copy these handles?
+ 			pDest->hBitmap = medium.hBitmap;
+ 			break;
+ 		case TYMED_MFPICT:
+ 			pDest->hMetaFilePict = medium.hMetaFilePict;
+ 			break;
+ 		case TYMED_ENHMF:
+ 			pDest->hEnhMetaFile = medium.hEnhMetaFile;
+ 			break;
+ 		case TYMED_HGLOBAL: {
+ 			UINT cb = GlobalSize(medium.hGlobal);
+ 			pDest->hGlobal = GlobalAlloc(GMEM_FIXED, cb);
+ 			if (!pDest->hGlobal) {
+ 				PyErr_NoMemory();
+ 				return FALSE;
+ 			}
+ 			memcpy(pDest->hGlobal, medium.hGlobal, cb);
+ 			break;
+ 		}
+ 		case TYMED_FILE:
+ 			if (medium.lpszFileName) {
+ 				int cch = wcslen(medium.lpszFileName) + 1;
+ 				if (!(pDest->lpszFileName = (WCHAR *)CoTaskMemAlloc(sizeof(WCHAR) * cch))) {
+ 					PyErr_NoMemory();
+ 					return FALSE;
+ 				}
+ 				wcsncpy(pDest->lpszFileName, medium.lpszFileName, cch);
+ 			}
+ 			break;
+ 		case TYMED_ISTREAM:
+ 			pDest->pstm = medium.pstm;
+ 			if (pDest->pstm) pDest->pstm->AddRef();
+ 			break;
+ 		case TYMED_ISTORAGE:
+ 			pDest->pstg = medium.pstg;
+ 			if (pDest->pstg) pDest->pstg->AddRef();
+ 			break;
+ 		case TYMED_NULL:
+ 			// nothing to do
+ 			break;
+ 		default:
+ 			PyErr_Format(PyExc_ValueError, "Unknown tymed value '%d'", medium.tymed);
+ 			return FALSE;
+ 	}
+ 	pDest->tymed = medium.tymed;
+ 	return TRUE;
+ }
  void PySTGMEDIUM::Close()
  {
Index: PyIDataObject.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/extensions/PyIDataObject.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** PyIDataObject.cpp	25 Apr 2004 04:10:48 -0000	1.4
--- PyIDataObject.cpp	12 Jun 2004 13:31:50 -0000	1.5
***************
*** 332,337 ****
  	if (PySTGMEDIUM_Check(result)) {
  		PySTGMEDIUM *pym = (PySTGMEDIUM *)result;
! 		memcpy(pmedium, &pym->medium, sizeof(STGMEDIUM));
! 		pym->DropOwnership();
  	}
  	hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
--- 332,336 ----
  	if (PySTGMEDIUM_Check(result)) {
  		PySTGMEDIUM *pym = (PySTGMEDIUM *)result;
! 		pym->CopyTo(pmedium);
  	}
  	hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
 |