//MFC剪切板操作的標準模式源碼:
void CMFCClipboardDlg::OnBnClickedCopyButton()
{
/////////////////////////////////////////////////////////////////////////
// 1. Get text from edit control.
//
CString strData;
m_editSource.GetWindowTextW(strData);
int len = strData.GetLength();
if (len <= 0)
return;
/////////////////////////////////////////////////////////////////////////
// 2. Open and empty clipboard. (OpenClipboard, EmptyClipboard)
//
if (!OpenClipboard())
return;
EmptyClipboard();
/////////////////////////////////////////////////////////////////////////
// 3. Create global buffer. (GlobalAlloc)
//
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len + 1));
if (hglbCopy == NULL)
{
CloseClipboard();
return;
}
/////////////////////////////////////////////////////////////////////////
// 4. Lock the buffer. (GlobalLock)
//
char* lptstrCopy = (char*)GlobalLock(hglbCopy);
/////////////////////////////////////////////////////////////////////////
// 5. Copy text to the buffer. (strcpy)
//
strcpy(lptstrCopy, (CStringA)strData);
/////////////////////////////////////////////////////////////////////////
// 6. Unlock the buffer. (GlobalUnlock)
//
GlobalUnlock(hglbCopy);
/////////////////////////////////////////////////////////////////////////
// 7. Set buffer data to clipboard. (SetClipboardData)
//
SetClipboardData(CF_TEXT, hglbCopy);
/////////////////////////////////////////////////////////////////////////
// 8. Close clipboard. (CloseClipboard)
//
CloseClipboard();
}
其中的幾個函數的解釋如下:
調用GlobalAlloc函數分配一塊內存,該函數會返回分配的內存句柄。
調用GlobalLock函數鎖定內存塊,該函數接受一個內存句柄作爲參數,然後返回一個指向被鎖定的內存塊的指針。您可以用該指針來讀寫內存。
調用GlobalUnlock函數來解鎖先前被鎖定的內存,該函數使得指向內存塊的指針無效。
調用GlobalFree函數來釋放內存塊。您必須傳給該函數一個內存句柄。
GlobalAlloc
函數原型:
GlobalAlloc(UINT uFLAG,DWORD dwBytes);
說明
分配一個全局內存塊
返回值
Long,返回全局內存句柄。零表示失敗。會設置GetLastError
參數表
參數 類型及說明
uFlags Long,對分配的內存類型進行定義的常數標誌,如下所示:
GMEM_FIXED 分配一個固定內存塊
GMEM_MOVEABLE 分配一個可移動內存塊
GMEM_DISCARDABLE 分配一個可丟棄內存塊
GMEM_NOCOMPACT 堆在這個函數調用期間不進行累積
GMEM_NODISCARD 函數調用期間不丟棄任何內存塊
GMEM_ZEROINIT 新分配的內存塊全部初始化成零
dwBytes Long,要分配的字符數
註解
如指定了 GMEM_FIXED,那麼返回值就是要使用的實際內存地址即指針(GlobalLock 會返回同樣的值)——所以在使用固定內存塊的時候不需要執行一個 GlobalLock/GlobalUnlock 操作
由於 Win32 採用了高級的內存管理方案,所以使用可移動的內存塊並沒有什麼好處
用這個函數分配的內存塊允許在8位邊界以內
GlobalLock
函數功能描述:鎖定一個全局的內存對象,返回指向該對象的第一個字節的指針
函數原型:
LPVOID GlobalLock( HGLOBAL hMem )
參數:
hMem:全局內存對象的句柄。這個句柄是通過GlobalAlloc或GlobalReAlloc來得到的
返回值:
調用成功,返回指向該對象的第一個字節的指針
調用失敗,返回NULL,可以用GetLastError來獲得出錯信息
注意:
調用過GlobalLock鎖定一塊內存區後,一定要調用GlobalUnlock來解鎖。
GlobalUnlock
函數功能描述:解除被鎖定的全局內存對象
函數原型:BOOL GlobalUnlock( HGLOBAL hMem );
參數:hMem:全局內存對象的句柄
返回值:
非零值,指定的內存對象仍處於被鎖定狀態
0,函數執行出錯,可以用GetLastError來獲得出錯信息,如果返回NO_ERROR,則表示內存對象已經解鎖了
注意:這個函數實際上是將內存對象的鎖定計數器減一,如果計數器不爲0,則表示執行過多個GlobalLock函數來對這個內存對象加鎖,需要對應數目的GlobalUnlock函數來解鎖。
如果通過GetLastError函數返回錯誤碼爲ERROR_NOT_LOCKED,則表示未加鎖或已經解鎖。