关于OLE剪贴板的小问题
我使用OLE剪贴板剪贴一段CString文字,设置格式CF_TEXT,但是在代码中调用 COleDataObject对象的 GetGlobalData方法时出现了非法访问,其中代码如下:
在执行拷贝的按钮单击响应事件中:
COleDataSource * pSource = SaveText(); //SavtText为自己写的程序,在下面
if(pSource)
{
pSource->SetClipboard();
}
在执行粘贴的按钮单击响应事件中:
COleDataObject dataObject;
VERIFY(dataObject.AttachClipboard); //从剪贴板得到
DoPasteText(&dataObject); //DoPasteText为自己写的程序,在下面
两个自己写的函数如下:SaveText , DoPasteText
//从m_cSource编辑框控件得到字符串,从字符串的内容创建数据来源对象。
//构造一个COldDataSource对象,然后,将其字符串内容拷贝到全局内存中。
//最后,调用CacheGlobalData来存储在数据来源对象中的HGLOBAL句柄。
COleDataSource * COLEPasteDlg::SaveText()
{
CString strSource;
m_cSource.GetWindowText(strSource);
if(!strSource.IsEmpty()) //if the source string is not empty.
{
COleDataSource * pSource = new COleDataSource();
int nTextSize = strSource.GetLength()-1;
HGLOBAL hText = ::GlobalAlloc(GMEM_SHARE,nTextSize);
LPSTR pText =(LPSTR)::GlobalLock(hText);
ASSERT(pText);
strcpy(pText ,strSource);
::GlobalUnlock(hText);
/*
STGMEDIUM stg;
FORMATETC fmt;
SETFORMATETC(fmt, CF_TEXT, DVASPECT_CONTENT,NULL,TYMED_HGLOBAL,1);
stg.hGlobal = hText;
pSource->CacheData(CF_TEXT,&stg,&fmt);
*/
FORMATETC fmt;
SETFORMATETC(fmt, CF_TEXT, DVASPECT_CONTENT,NULL,TYMED_HGLOBAL,1);
pSource->CacheGlobalData(CF_TEXT, hText,&fmt);
return pSource;
}
return NULL;
}
//从数据对象中填充 strTarget,然后填充到编辑框控件m_cTarget中
BOOL COLEPasteDlg::DoPasteText(COleDataObject *pDataObject)
{
FORMATETC fmt;
SETFORMATETC(fmt, CF_TEXT, DVASPECT_CONTENT,NULL,TYMED_HGLOBAL,1);
//--------------------------------------------Error Occur---------
//下面这一行出现了错误,我跟踪发现是对象的GetData函数出现了错误
//(GetGlobalData在内部实现时调用了GetData函数)
HGLOBAL hText = pDataObject->GetGlobalData(CF_TEXT,&fmt);
//--------------------------------------------Error End---------
ASSERT(hText != NULL);
CString strTarget= (LPSTR)::GlobalLock(hText);
m_cTarget.SetWindowText(strTarget);
::GlobalUnlock(hText);
return TRUE;
}