做孙鑫老师进程间通信之剪切板实验,由于历程用的是VC6.0, 我用的是VS2010,在一些数据类型上有些不兼容。
比如 strcpy(pBuf, str); //str是CSting类型,函数要求是(const char*),编译时出错。
考虑从编辑框获得数据 GetDlgItemText(IDC_EDIT_SEND,str);
str的数据要复制给 pBuf,采用下面操作即可
int str_len=0;
str_len = str.GetLength()+1; //str的长度
temp = (char*)malloc(str_len);
for(int i=0;i<str_len;i++)
{
temp[i]=str.GetAt(i);
}
strcpy(pBuf, temp);
free(temp);
char* 直接复制给CString没问题,发送和接收按钮的回调函数如下:
void CClipbordDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
if(OpenClipboard())
{
CString str;
HANDLE hClip;
char *pBuf;
char *temp;
int str_len=0;
EmptyClipboard();
GetDlgItemText(IDC_EDIT_SEND,str);
hClip = GlobalAlloc(GMEM_MOVEABLE,str.GetAllocLength()+1);
pBuf = (char*)GlobalLock(hClip);
str_len = str.GetLength()+1; //str的长度
temp = (char*)malloc(str_len);
for(int i=0;i<str_len;i++)
{
temp[i]=str.GetAt(i);
}
strcpy(pBuf, temp);
free(temp);
str.ReleaseBuffer();
GlobalUnlock(hClip);
SetClipboardData(CF_TEXT,hClip);
CloseClipboard();
}
}
void CClipbordDlg::OnBnClickedButtonRecv()
{
// TODO: 在此添加控件通知处理程序代码
if(OpenClipboard())//打开剪切板
{
if(IsClipboardFormatAvailable(CF_TEXT))//判断剪切板的内容格式是否是我们需要的
{
HANDLE hChip;
char *pBuf;
CString str;
hChip=GetClipboardData(CF_TEXT);//返回一个句柄
pBuf=(char*)GlobalLock(hChip);//获取内容
str = pBuf;
GlobalUnlock(hChip);
SetDlgItemText(IDC_EDIT_RECV,str);//设置内容
}
CloseClipboard();
}
}
结果如下