VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 277|回复: 3

[已解决]进程通信剪切板,只能复制第一个字节,感谢各位大佬进来指正

[复制链接]
56_avatar_middle
最佳答案
0 
donate_vip 发表于 2021-9-26 15:14:15 | 显示全部楼层 |阅读模式
最近在看孙鑫的MFC视频,看到进程通信时候出了个问题,setclipboarddata();然后粘贴只能粘贴第一个字符,比如“123456789”,只能复制1.代码也很简单,就是从cedit读取数据然后粘贴,原本打算用char*,但是strcpy(char*,cstring)函数在vs2017不能用,然后改成TCHAR,我看了一眼内存,pdatsbuff指向的空间所有字符串已经被复制了,只能赋值第一个字节想不通,
CString str;
GetDlgItemText(IDC_EDIT1_send, str);
TCHAR * pStrData = str.GetBuffer(0);
str.ReleaseBuffer();
if (OpenClipboard())
         {
                 TCHAR * pDataBuf;
                 HGLOBAL hGlobalClip;
                 hGlobalClip = GlobalAlloc(GHND, (_tcslen(pStrData) + 1) * sizeof(TCHAR)
                 );
                 pDataBuf = (TCHAR *)GlobalLock(hGlobalClip);
                 _tcscpy_s(pDataBuf, (_tcslen(pStrData) + 1) * sizeof(TCHAR), pStrData);
                 GlobalUnlock(hGlobalClip);
                 EmptyClipboard();
                 SetClipboardData(CF_TEXT, hGlobalClip);
                 CloseClipboard();
         }
下面的代码是可以完全粘贴所有字节
CHAR* psdata = "你好";
        if (OpenClipboard())
        {
                HANDLE hglobal = GlobalAlloc(GHND, strlen(psdata) + 1);        //分配全局内存,设置内存类型,大小为字符串长度+1
                char* m_pBase = nullptr;
                m_pBase = (char*)GlobalLock(hglobal);        //得到内存空间的首地址,加锁
                strcpy_s(m_pBase, strlen(psdata) + 1, psdata);        //复制字符串到地址空间中去,类似于内存映射中的操作
                GlobalUnlock(hglobal);       
                EmptyClipboard();
                SetClipboardData(CF_TEXT, hglobal);
                CloseClipboard();
        }
最佳答案
31_avatar_small
2021-9-26 23:22:50
本帖最后由 cpp2019 于 2021-9-26 23:54 编辑

// 这是剪贴板操作,跟进程通信没有关系,只能说可以把它当做通信的桥梁,这种通信方式我是不推荐使用的。
  1. void CMFCAppDlg::OnBnClickedOk()
  2. {
  3.         UINT uFormat = CF_TEXT;

  4. #ifdef UNICODE
  5.         uFormat = CF_UNICODETEXT;
  6. #endif // UNICODE

  7.         CString str(_T("这是要给剪贴板的内容"));
  8.         if (OpenClipboard())
  9.         {
  10.                 if (!EmptyClipboard())
  11.                 {
  12.                         CloseClipboard();
  13.                         return;
  14.                 }
  15.                 HGLOBAL hGlobalClip = GlobalAlloc(GMEM_DDESHARE, (str.GetLength() + 1) * sizeof(TCHAR));
  16.                 TCHAR* pDataBuf = (TCHAR *)GlobalLock(hGlobalClip);
  17.                 _tcscpy_s(pDataBuf, (str.GetLength() + 1) * sizeof(TCHAR), str);
  18.                 GlobalUnlock(hGlobalClip);
  19.                 SetClipboardData(uFormat, hGlobalClip);
  20.                 CloseClipboard();
  21.                 // 打印
  22.                 OutputDebugString(pDataBuf);
  23.         }
  24. }
复制代码




上一篇:帮我看看程序代码哪里出错了。vs2005编译不成功
下一篇:请教下cin>>输入问题
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-9-26 23:22:50 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 cpp2019 于 2021-9-26 23:54 编辑

// 这是剪贴板操作,跟进程通信没有关系,只能说可以把它当做通信的桥梁,这种通信方式我是不推荐使用的。
  1. void CMFCAppDlg::OnBnClickedOk()
  2. {
  3.         UINT uFormat = CF_TEXT;

  4. #ifdef UNICODE
  5.         uFormat = CF_UNICODETEXT;
  6. #endif // UNICODE

  7.         CString str(_T("这是要给剪贴板的内容"));
  8.         if (OpenClipboard())
  9.         {
  10.                 if (!EmptyClipboard())
  11.                 {
  12.                         CloseClipboard();
  13.                         return;
  14.                 }
  15.                 HGLOBAL hGlobalClip = GlobalAlloc(GMEM_DDESHARE, (str.GetLength() + 1) * sizeof(TCHAR));
  16.                 TCHAR* pDataBuf = (TCHAR *)GlobalLock(hGlobalClip);
  17.                 _tcscpy_s(pDataBuf, (str.GetLength() + 1) * sizeof(TCHAR), str);
  18.                 GlobalUnlock(hGlobalClip);
  19.                 SetClipboardData(uFormat, hGlobalClip);
  20.                 CloseClipboard();
  21.                 // 打印
  22.                 OutputDebugString(pDataBuf);
  23.         }
  24. }
复制代码
56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-9-28 15:21:39 | 显示全部楼层
cpp2019 发表于 2021-9-26 23:22
// 这是剪贴板操作,跟进程通信没有关系,只能说可以把它当做通信的桥梁,这种通信方式我是不推荐使用的。
...

大佬,只能粘贴只一个字节是什么原因啊
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-9-28 19:24:51 | 显示全部楼层
enchanter 发表于 2021-9-28 15:21
大佬,只能粘贴只一个字节是什么原因啊

原因就在这儿
  1.         UINT uFormat = CF_TEXT;

  2. #ifdef UNICODE
  3.         uFormat = CF_UNICODETEXT;
  4. #endif // UNICODE
复制代码
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-10-23 16:04

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表