之前在开发一个新功能的时候,需要将文件的路径信息通过剪切板传递给指定的目标。于是就需要将文件信息写入到剪切板中,获取方则从剪切板中读取想要获取的路径信息。
剪切板是通过全局内存来共享数据的,存放数据的内存是通过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 == NULL )
{
return;

在开发中,将文件路径信息写入剪切板后,通常会使用GlobalAlloc分配内存。然而,错误地调用GlobalFree释放内存可能导致剪切板功能异常。实际上,剪切板会负责管理并释放这部分内存,因此无需手动释放。
订阅专栏 解锁全文
1738

被折叠的 条评论
为什么被折叠?



