添加剪贴板操作代码后C++程序无法运行(VS2022报错求助)
问题描述
在C++应用中添加以下代码后程序无法正常运行:
void setclipbord(const char* szBuffer) { OpenClipboard(NULL); HGLOBAL hClipboardData = GlobalAlloc(GMEM_MOVEABLE, strlen(szBuffer) + 1); char* pchData = (char*)GlobalLock(hClipboardData); strcpy(pchData, szBuffer); GlobalUnlock(hClipboardData); EmptyClipboard(); SetClipboardData(CF_TEXT, hClipboardData); CloseClipboard(); }
使用Visual Studio 2022编译时,出现1个错误和2个警告:
警告 'hClipboardData' 可能为'0',是'GlobalAlloc()'返回值的副本:不符合'GlobalLock'函数的规范。
警告 'pchData' 可能为'0':不符合'strcpy'函数的规范。
错误 'strcpy':该函数或变量可能不安全。建议使用strcpy_s。要禁用弃用提示,请使用_CRT_SECURE_NO_WARNINGS。详见在线帮助。
引用的头文件:
#include <iostream> #include <string> #include <windows.h> #include <winuser.h> #include <cstring> #include <time.h>
解决方案
1. 处理strcpy的错误
Visual Studio默认禁用无边界检查的不安全C标准库函数,strcpy因此被标记为错误,有两种解决方式:
- 方案一:使用安全版本
strcpy_sstrcpy_s需要额外传入目标缓冲区的大小,替换原代码中的strcpy行:strcpy_s(pchData, strlen(szBuffer) + 1, szBuffer); - 方案二:禁用安全警告
在项目预处理器定义中添加_CRT_SECURE_NO_WARNINGS,或在代码最开头(头文件引用前)添加:#define _CRT_SECURE_NO_WARNINGS
2. 消除空指针警告
两个警告均因未检查函数返回值是否为空导致,需添加错误处理逻辑,避免空指针操作:
- 检查
GlobalAlloc返回值:内存分配失败时返回NULL,需提前退出并释放资源 - 检查
GlobalLock返回值:内存锁定失败时返回NULL,同样需清理资源后退出 - 额外检查
OpenClipboard返回值:避免剪贴板打开失败后执行后续无效操作
修改后的完整代码:
void setclipbord(const char* szBuffer) { if (!OpenClipboard(NULL)) { // 可添加错误日志或提示,比如OutputDebugString("打开剪贴板失败") return; } size_t bufferSize = strlen(szBuffer) + 1; HGLOBAL hClipboardData = GlobalAlloc(GMEM_MOVEABLE, bufferSize); if (hClipboardData == NULL) { CloseClipboard(); return; } char* pchData = (char*)GlobalLock(hClipboardData); if (pchData == NULL) { GlobalFree(hClipboardData); CloseClipboard(); return; } // 根据选择的方案,二选一 strcpy_s(pchData, bufferSize, szBuffer); // strcpy(pchData, szBuffer); // 仅在禁用安全警告时使用 GlobalUnlock(hClipboardData); EmptyClipboard(); SetClipboardData(CF_TEXT, hClipboardData); CloseClipboard(); }
内容的提问来源于stack exchange,提问作者karkit
相关产品推荐
相关产品推荐

