之前在开发一个新功能的时候,需要将文件的路径信息通过剪切板传递给指定的目标。于是就需要将文件信息写入到剪切板中,获取方则从剪切板中读取想要获取的路径信息。
剪切板是通过全局内存来共享数据的,存放数据的内存是通过GlobalAlloc来分配的。问题就出在这个用GlobalAlloc来分配的的内存上,在将文件信息写入到剪切板之后,想当然的就调用GlobalFree来释放之前申请来的内存,于是导致了后续的复制/粘贴功能的异常。
经查阅,找出了对应的原因:不需要GlobalFree来内存,因为内存已经有剪切板托管了,最终由剪切板来释放。相关代码如下所示:
// 将图片文件拷贝到剪切板(将包含文件名的文件完整路径添加到剪切板中)
void CCatchScreenDlg::CopyCatchFileToClipboard( CString strFilePath )
{
DROPFILES dropFiles;
UINT uGblLen, uDropFilesLen;
HGLOBAL hGblFiles, hGblEffect;
char *szData, *szFileList;
DWORD *pdwDropEffect;
hGblEffect = GlobalAlloc( GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, sizeof(DWORD) );
if ( hGblEffect &