You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加剪贴板操作代码后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_s
    strcpy_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:43:39