Use GlobalPtrLock instead of manual GlobalUnlock() calls

Make the code safer and shorter by using RAII wrapper instead of manual
Global{Lock,Unlock}() calls.

No real changes.
This commit is contained in:
Vadim Zeitlin
2020-08-22 19:44:10 +02:00
parent 0d7be7c189
commit 75ad798d8b
4 changed files with 49 additions and 65 deletions

View File

@@ -245,9 +245,12 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
abs(ds.dsBmih.biHeight);
HANDLE hMem;
hMem = ::GlobalAlloc(GHND, ds.dsBmih.biSize + numColors*sizeof(RGBQUAD) + bmpSize);
if ( hMem )
if ( !hMem )
break;
{
char* pDst = (char*)::GlobalLock(hMem);
GlobalPtrLock ptr(hMem);
char* pDst = (char*)ptr.Get();
memcpy(pDst, &ds.dsBmih, ds.dsBmih.biSize);
pDst += ds.dsBmih.biSize;
if ( numColors > 0 )
@@ -259,11 +262,11 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
pDst += numColors*sizeof(RGBQUAD);
}
memcpy(pDst, dib.GetData(), bmpSize);
::GlobalUnlock(hMem);
} // unlock hMem
handle = ::SetClipboardData(CF_DIB, hMem);
}
}
}
break;
}
#endif
@@ -276,14 +279,16 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
{
wxMetafile *wxMF = (wxMetafile *)data;
HANDLE data = GlobalAlloc(GHND, sizeof(METAFILEPICT) + 1);
METAFILEPICT *mf = (METAFILEPICT *)GlobalLock(data);
{
GlobalPtrLock ptr(data);
METAFILEPICT *mf = (METAFILEPICT *)data.Get();
mf->mm = wxMF->GetWindowsMappingMode();
mf->xExt = width;
mf->yExt = height;
mf->hMF = (HMETAFILE) wxMF->GetHMETAFILE();
GlobalUnlock(data);
wxMF->SetHMETAFILE((WXHANDLE) NULL);
} // unlock data
handle = SetClipboardData(CF_METAFILEPICT, data);
break;
@@ -326,11 +331,7 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
HANDLE hGlobalMemory = GlobalAlloc(GHND, l);
if ( hGlobalMemory )
{
LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory);
memcpy(lpGlobalMemory, s, l);
GlobalUnlock(hGlobalMemory);
memcpy(GlobalPtrLock(hGlobalMemory), s, l);
}
handle = SetClipboardData(dataFormat, hGlobalMemory);
@@ -344,9 +345,7 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
HANDLE hGlobalMemory = ::GlobalAlloc(GHND, size);
if ( hGlobalMemory )
{
LPWSTR lpGlobalMemory = (LPWSTR)::GlobalLock(hGlobalMemory);
memcpy(lpGlobalMemory, s, size);
::GlobalUnlock(hGlobalMemory);
memcpy(GlobalPtrLock(hGlobalMemory), s, size);
}
handle = ::SetClipboardData(CF_UNICODETEXT, hGlobalMemory);
@@ -407,9 +406,7 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4);
// Put your string in the global memory...
ptr = (char *)GlobalLock(hText);
strcpy(ptr, buf);
GlobalUnlock(hText);
strcpy((char*)GlobalPtrLock(hText).Get(), buf);
handle = ::SetClipboardData(gs_htmlcfid, hText);
@@ -861,11 +858,9 @@ bool wxClipboard::GetData( wxDataObject& data )
if ( hMem )
{
wxTextDataObject& textDataObject = (wxTextDataObject &)data;
const void* buf = ::GlobalLock(hMem);
DWORD size = ::GlobalSize(hMem);
bool ok = textDataObject.SetData(size, buf);
::GlobalUnlock(hMem);
return ok;
GlobalPtrLock ptr(hMem);
return textDataObject.SetData(ptr.GetSize(), ptr);
}
}
break;
@@ -885,11 +880,9 @@ bool wxClipboard::GetData( wxDataObject& data )
if ( hMem )
{
wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data;
const void* buf = ::GlobalLock(hMem);
DWORD size = ::GlobalSize(hMem);
bool ok = bitmapDataObject.SetData(size, buf);
::GlobalUnlock(hMem);
return ok;
GlobalPtrLock ptr(hMem);
return bitmapDataObject.SetData(ptr.GetSize(), ptr);
}
}
break;
@@ -901,11 +894,9 @@ bool wxClipboard::GetData( wxDataObject& data )
if ( hMem )
{
wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
const void* buf = ::GlobalLock(hMem);
DWORD size = ::GlobalSize(hMem);
bool ok = metaFileDataObject.SetData(wxDF_METAFILE, size, buf);
::GlobalUnlock(hMem);
return ok;
GlobalPtrLock ptr(hMem);
return metaFileDataObject.SetData(wxDF_METAFILE, ptr.GetSize(), ptr);
}
}
break;

View File

@@ -266,14 +266,17 @@ static bool wxGetDefaultDeviceName(wxString& deviceName, wxString& portName)
if (pd.hDevNames)
{
lpDevNames = (LPDEVNAMES)GlobalLock(pd.hDevNames);
{
GlobalPtrLock ptr(pd.hDevNames);
lpDevNames = (LPDEVNAMES)ptr.Get();
lpszDeviceName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;
lpszPortName = (LPTSTR)lpDevNames + lpDevNames->wOutputOffset;
deviceName = lpszDeviceName;
portName = lpszPortName;
} // unlock pd.hDevNames
GlobalUnlock(pd.hDevNames);
GlobalFree(pd.hDevNames);
pd.hDevNames=NULL;
}

View File

@@ -95,16 +95,15 @@ HGLOBAL wxGlobalClone(HGLOBAL hglobIn)
{
HGLOBAL hglobOut = NULL;
LPVOID pvIn = GlobalLock(hglobIn);
if (pvIn)
GlobalPtrLock ptrIn(hglobIn);
if (ptrIn)
{
SIZE_T cb = GlobalSize(hglobIn);
SIZE_T cb = ptrIn.GetSize();
hglobOut = GlobalAlloc(GMEM_FIXED, cb);
if (hglobOut)
{
CopyMemory(hglobOut, pvIn, cb);
CopyMemory(hglobOut, ptrIn, cb);
}
GlobalUnlock(hglobIn);
}
return hglobOut;
@@ -637,27 +636,18 @@ STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
case TYMED_HGLOBAL:
{
// copy data
HGLOBAL hGlobal = pmedium->hGlobal;
void *pBuf = GlobalLock(hGlobal);
if ( pBuf == NULL ) {
wxLogLastError(wxT("GlobalLock"));
GlobalPtrLock ptr(pmedium->hGlobal);
if ( !ptr )
return E_OUTOFMEMORY;
}
wxDataFormat format = pformatetc->cfFormat;
// possibly put the size in the beginning of the buffer
pBuf = m_pDataObject->SetSizeInBuffer
(
pBuf,
::GlobalSize(hGlobal),
format
);
void* const pBuf =
m_pDataObject->SetSizeInBuffer(ptr, ptr.GetSize(), format);
if ( !m_pDataObject->GetDataHere(format, pBuf) )
return E_UNEXPECTED;
GlobalUnlock(hGlobal);
}
break;

View File

@@ -147,7 +147,9 @@ wxCreateDevNames(const wxString& driverName,
( driverName.length() + 1 +
printerName.length() + 1 +
portName.length()+1 ) * sizeof(wxChar) );
LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(hDev);
GlobalPtrLock ptr(hDev);
LPDEVNAMES lpDev = (LPDEVNAMES)ptr.Get();
lpDev->wDriverOffset = sizeof(WORD) * 4 / sizeof(wxChar);
wxStrcpy((wxChar*)lpDev + lpDev->wDriverOffset, driverName);
@@ -160,8 +162,6 @@ wxCreateDevNames(const wxString& driverName,
wxStrcpy((wxChar*)lpDev + lpDev->wOutputOffset, portName);
lpDev->wDefault = 0;
GlobalUnlock(hDev);
}
return hDev;