应用场景
void CWMCOPYDATASENDDlg::OnBnClickedSend()
{
// TODO: 在此添加控件通知处理程序代码
//必须要知道标题 句柄
CString strWindowTitle=_T("MFCRecv");
CString strDataToSend=_T("Hello,this is Bingo WM_COPYDATA");
//句柄
HWND hRecvWnd=::FindWindow(NULL,strWindowTitle,GetBuffer(0));
if(hRecvWnd!=NULL&&::IsWindow(hRecvWnd)){
//数据的封装
COPYDATASTRUCT cpd;
cpd.dwData=0;
cpd.cbData=strDataToSend.GetLength()*sizeof(TCHAR);
cpd.lpData=(PVOID)strDataToSend.GetBuffer(0);
::SendMessage(hRecvWnd,WM_COPYDATA,(WPARAM)(AfxGetApp()->m_pMainWnd),(LPARAM)&cpd);
}
}
解释
在 MFC 中,GetBuffer()
和 GetBuffer(0)
实际上是等效的。两者都用于获取一个指向内部缓冲区的指针,该缓冲区存储了 CString
对象中包含的字符串数据。不同之处在于,GetBuffer()
默认将为内部缓冲区分配足够的额外空间来容纳字符串数据及其终止 null 字符,而 GetBuffer(0)
则不会分配额外的空间,只返回当前字符串数据的指针。
因此,对于GetBuffer(0)
,在调用时不会执行任何额外的内存分配,这在某些情况下可能更高效,尤其是当你知道字符串的长度时。而对于GetBuffer()
,它会根据当前字符串的长度自动分配足够的内存空间,这可能会导致额外的内存分配和复制操作,但在不知道字符串长度的情况下很有用。
在本例中,由于知道字符串的长度,所以使用 GetBuffer(0)
和 GetBuffer()
没有区别,都可以获取到有效的指针。