在32位WIN7 VS2012环境下测试通过,在64位WIN7 VS2013环境下GlobalLock和GlobalSize函数返回NULL,具体参见注释

// 读取给定文件名的Doc文档中的数据
BOOL CWordOperator::ReadInDataFromDoc(CString strFileName)
{// 读取Config文件,获得需要读取的单元格坐标LoadConfig();// COM相关变量COleVariant vTrue((short)TRUE);COleVariant vFalse((short)FALSE);COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);// Word相关变量CApplication wordApp;   // 在对象继承结构中是最顶层的对象,可以通过它的方法访问别的工作类型的对象(本例主要是word)CDocuments docs;        // 代表所有打开的文档对象CDocument0 doc;         // 单一文件CSelection selection;   // 选择区域CRange rangeWord;       // 文档区域CTables0 tables;        // 所有表格CTable0 table;          // 单一表格CCell cell;             // 单元格CnlineShapes shapes;    // 图片集合CnlineShape shape;      // 图片// 启动Word程序if (!wordApp.CreateDispatch(_T("word.application"))) // 启动Word{AfxMessageBox(_T("无法启动Word"));return FALSE;}// 设置Word不可见wordApp.put_Visible(FALSE);// 打开指定Docdocs = wordApp.get_Documents();doc = docs.Open(COleVariant(strFileName), vFalse, vTrue, vFalse, vOpt, vOpt,vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt);if (!doc)   // 打开失败{AfxMessageBox(_T("无法打开文件"));return FALSE;}// 获得选择焦点selection = wordApp.get_Selection();// 获得表格tables = doc.get_Tables();table = tables.Item(1); // 索引从1开始// 根据XML中定义的节点中的行列进行读取
//  for each (DocCellData data in m_lstDocDatas)for (std::list<DocCellData>::iterator it = m_lstDocDatas.begin();it != m_lstDocDatas.end(); it++){DocCellData& data = *it;// 根据节点中设定的行列获得单元格cell = table.Cell(data.nRowIndex, data.nColIndex);if (!cell)  // 错误提示{CString strErr;strErr.Format(_T("%s指定的%d行%d列的单元格不存在"), data.strXMLName,&data.nRowIndex, &data.nColIndex);AfxMessageBox(strErr);break;}// 取得单元格内容rangeWord = cell.get_Range();// 判断类型switch (data.type){case TextType:  // 文本类型data.strValue = rangeWord.get_Text();
//          OpenClipboard(NULL);
//          // 清除剪切板内容
//          EmptyClipboard();
//          // 不关闭则复制操作不起作用,无法复制到剪切板里
//          CloseClipboard();
//          rangeWord.Copy();
//          OpenClipboard(NULL);
//          if (true)
//          {//              HGLOBAL hClipBoard = ::GetClipboardData(CF_TEXT);
//              void* pMem = ::GlobalLock(hClipBoard);
//              n = GlobalSize(hClipBoard);
//              CString str((char*)pMem);
//          }break;case PicType:   // 图片类型// 取得所有图片集合shapes = rangeWord.get_InlineShapes();if (shapes.get_Count()) // 存在图片{// 利用剪切板获得图片// 取得第一张图shape = shapes.Item(1);shape.Select();// 复制到剪切板selection = wordApp.get_Selection();// 打开剪切板(占用状态,此时进行复制粘贴等操作将无效果)::OpenClipboard(NULL);// 清除剪切板内容::EmptyClipboard();// 不关闭则复制操作不起作用,无法复制到剪切板里::CloseClipboard();selection.CopyAsPicture();// 32位WIN7下VS2012可以运行// 打开剪切板,并且剪切板里存在图片
//              if (::IsClipboardFormatAvailable(CF_DIB) &&
//                     ::OpenClipboard(NULL))
//              {//                  // 取得剪切板中的图片数据
//                  HGLOBAL hClipBoard = ::GetClipboardData(CF_DIB);
//                  // 锁定内存位置吗,以防系统将内存页移位
//                  LPVOID pMem = ::GlobalLock(hClipBoard);
//
//                  // 如果存在图片,则进行复制
//                  if (pMem)
//                  {//                      // 取得位图大小
//                      data.nPicSize = ::GlobalSize(hClipBoard);
//                      // 复制到结构中
//                      data.pBmp = new BYTE[data.nPicSize];
//                      memcpy(data.pBmp, pMem, data.nPicSize);
//                      // 解锁内存
//                      ::GlobalUnlock(hClipBoard);
//                  }
//                  else
//                  {//                      data.nPicSize = 0;
//                  }
//                  //关闭剪贴板,释放剪贴板资源的占用权
//                  ::CloseClipboard();
//              }// 64位WIN7下VS2013可以运行if (::IsClipboardFormatAvailable(CF_ENHMETAFILE) &&::OpenClipboard(NULL)){// 首先生成EMF图片文件并存储CString strTempBmp(GetAppPath());strTempBmp += EMFFILENAME;  // 指定存储路径HANDLE hClipBoard = ::GetClipboardData(CF_ENHMETAFILE); // 从剪切板读取EMF格式内容(其它格式读不出来)HENHMETAFILE hTempBmp =::CopyEnhMetaFile((HENHMETAFILE)hClipBoard, strTempBmp);    // 存成文件// 关闭剪切板,释放剪贴板资源的占用权::CloseClipboard();if (hTempBmp)   // 图片存在{// 释放内存DeleteEnhMetaFile(hTempBmp);// 读入内存CFile emfFile(strTempBmp, CFile::modeRead); // 取得emf文件data.nPicSize = emfFile.GetLength();    // 取得文件大小(再加一)data.pBmp = new BYTE[data.nPicSize + 1];    // 分配内存emfFile.Read(data.pBmp, data.nPicSize); // 读入data.pBmp[data.nPicSize] = 0;   // 将最后一位置为结束位emfFile.Close();    // 关闭emf文件emfFile.Remove(strTempBmp); // 删除emf文件// 打开剪切板(占用状态,此时进行复制粘贴等操作将无效果)::OpenClipboard(NULL);// 清除剪切板内容::EmptyClipboard();// 不关闭则复制操作不起作用,无法复制到剪切板里::CloseClipboard();}}}break;default:break;}}// 关闭文档doc.Close(vFalse, vOpt, vOpt);// 退出WordwordApp.Quit(vFalse, vOpt, vOpt);return TRUE;
}
// 根据数据生成Doc文档
BOOL CWordOperator::WriteOutDocByData(CString strFileName)
{// COM相关变量COleVariant vTrue((short)TRUE);COleVariant vFalse((short)FALSE);COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);// Word相关变量CApplication wordApp;   // 在对象继承结构中是最顶层的对象,可以通过它的方法访问别的工作类型的对象(本例主要是word)CDocuments docs;        // 代表所有打开的文档对象CDocument0 doc;         // 单一文件CSelection selection;   // 选择区域CRange rangeWord;       // 文档区域CTables0 tables;        // 所有表格CTable0 table;          // 单一表格CCell cell;             // 单元格CnlineShapes shapes;    // 图片集合CnlineShape shape;      // 图片// 启动Word程序if (!wordApp.CreateDispatch(_T("word.application"))) // 启动Word{AfxMessageBox(_T("无法启动Word"));return FALSE;}// 设置Word不可见wordApp.put_Visible(TRUE);// 打开指定Docdocs = wordApp.get_Documents();CComVariant Template("");CComVariant NewTemplate(false), DocumentType(0), Visible;docs.Add(&Template, &NewTemplate, &DocumentType, &Visible);doc = docs.Item(&CComVariant(1));if (!doc)   // 打开失败{AfxMessageBox(_T("无法创建文件"));return FALSE;}// 获得选择焦点selection = wordApp.get_Selection();rangeWord = selection.get_Range();// 获得表格tables = doc.get_Tables();tables.Add(rangeWord, 10, 10, vOpt, vOpt);table = tables.Item(1); // 索引从1开始// 根据节点中设定的行列获得单元格cell = table.Cell(1, 1);// 根据XML中定义的节点中的行列进行读取for each (DocCellData data in m_lstDocDatas){// 取得单元格内容rangeWord = cell.get_Range();cell.Select();// 判断类型switch (data.type){case TextType:  // 文本类型rangeWord.put_Text(data.strValue);break;case PicType:   // 图片类型// 64位WIN7下VS2013调试通过if (TRUE)   // 跳过switch的语法检查{// 先存成文件CString strTempBmpFileName(GetAppPath());strTempBmpFileName += EMFFILENAME;  // 生成路径// 创建emf文件CFile emfFile(strTempBmpFileName,CFile::modeCreate | CFile::modeReadWrite);emfFile.Write(data.pBmp, data.nPicSize);    // 写入位图emfFile.Close();    // 关闭文件// 将图片插入到文档rangeWord.Select();shapes = selection.get_InlineShapes();  // 得到图片集合// 插入emf图片shapes.AddPicture(strTempBmpFileName, vFalse, vTrue,&_variant_t(rangeWord));// 删除emf文件emfFile.Remove(strTempBmpFileName);}// 32位WIN7下VS2012调试通过
//          // 打开剪切板(占用状态,此时进行复制粘贴等操作将无效果)
//          ::OpenClipboard(NULL);
//          // 清除剪切板内容
//          ::EmptyClipboard();
//          // 不关闭则复制操作不起作用,无法复制到剪切板里
//          ::CloseClipboard();
//
//          if (::OpenClipboard(NULL))
//          {//                 // 申请全局内存来存放BMP,以便交给剪切板
//              HGLOBAL hClipBoard = ::GlobalAlloc(GMEM_MOVEABLE, data.nPicSize);
//                 // 锁定内存地址
//              LPVOID pMem = ::GlobalLock(hClipBoard);
//                 // 复制位图
//              memcpy(pMem, data.pBmp, data.nPicSize);
//                 // 解锁内存
//              ::GlobalUnlock(hClipBoard);
//                 // 将位图设置到剪切板中
//              ::SetClipboardData(CF_DIB, hClipBoard);
//                 // 关闭剪切板
//              ::CloseClipboard();
//              rangeWord.Paste();
//              rangeWord.Paste();
//          }
//          //关闭剪贴板,释放剪贴板资源的占用权
//          ::CloseClipboard();break;default:break;}cell = cell.get_Next();}// 保存文档doc.Save();// 关闭文档doc.Close(vTrue, vOpt, vOpt);// 退出WordwordApp.Quit(vTrue, vOpt, vOpt);return TRUE;
}

VC 操作word部分代码(利用剪切板取得Word中的图片,ClipBoard, Addpicture)相关推荐

  1. java作弊_java利用剪切板的作弊工具

    [TOC] 背景及效果 考试又考试,考试何其多 天天为考试,万事成蹉跎 学子皆被分数累,春去秋来没快乐 朝闻老师吼,暮闻家长火 一生考试苦几何,请君听我考试歌 暑假前有个同学要上机考日语,然而对于他这 ...

  2. java 监控剪切板_java利用剪切板的作弊工具

    背景及效果 考试又考试,考试何其多 天天为考试,万事成蹉跎 学子皆被分数累,春去秋来没快乐 朝闻老师吼,暮闻家长火 一生考试苦几何,请君听我考试歌 暑假前有个同学要上机考日语,然而对于他这种连书的目录 ...

  3. Android--使用剪切板在Activity中传值

    在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取 ...

  4. html5图片剪切板,原生js实现基于base64数据复制图片到剪切板,可以粘贴出图片,模拟浏览器复制功能。...

    原生js实现基于base64数据复制图片到剪切板,可以粘贴出图片,模拟浏览器复制功能.前言: 初次发帖排版略丑,见谅.之前我们这边有个需求就是说,前端通过canvas截图然后, 点击一个按钮实现复制截 ...

  5. 利用ClaudiaIDE插件在VS中插入图片

    利用ClaudiaIDE插件在VS中插入图片 效果图 下载 设置插件 效果图 下载 github链接找到相应的版本如下图所示 我下了个2019的链接: 百度网盘 提取码:5xi8 设置插件 打开VS中 ...

  6. 剪切板复制word图片是本地路径_如何将图片数学公式快速输入到Word中?

    背景: 在日常科研.学习与工作中,我们可能需要使用到某些书籍.期刊或者规范上的公式,但是如果自己纯手打则会相当麻烦(数学系LaTeX高手请忽略),因此如果有工具能够解决这个问题,那真的是解决了一大痛点 ...

  7. VC非ASCII语言复制到剪切板乱码问题

    MFC版本 今天遇到奇怪的现象,日文系统下在控件上按下Ctrl+C,再粘贴出来得到乱码,非得切换到日文输入法再进行粘贴不可.经过代码分析,得出结论是剪切板SetClipboardData()时自动内存 ...

  8. python保存剪切板的图片_Python剪切板提取、截图、图片粘贴,操作汇总

    1. PIL::ImageGrab(不适用于Linux) 只适用于Windows & MacOS系统.Linux系统支持XCB的X11,详细说明. 1.1. 截图Grab ImageGrab. ...

  9. tmux系统剪切板_实践中的tmux:与系统剪贴板集成

    tmux系统剪切板 by Alexey Samoshkin 通过阿列克谢·萨莫什金(Alexey Samoshkin) 在实践中使用tmux:与系统剪贴板集成 (tmux in practice: i ...

最新文章

  1. Java面试题及答案整理( 2022年最新版,持续更新)
  2. 为什么集群要奇数_面试系列 redis数据删除amp;集群
  3. mac navicat premium 使用技巧
  4. jQuery中$(document).ready()和window.onload的区别?
  5. PCB板设计的12个细节,你做对了吗?
  6. CF786E-ALT【网络流,倍增】
  7. 解决JS:window.close()在Firefox下的不能关闭的问题,兼容IE/Firefox/Chrome
  8. 开源无人机_开源无人机,欧洲开源等等
  9. python_day9 回调函数
  10. python sleep 毫秒_如何在python中休眠Webdriver毫秒
  11. 候选公示!高工智能汽车金球奖第二批入围年度产品/方案亮相
  12. SVM多分类问题例子+matlab代码
  13. CAD2007 病毒 处理办法
  14. 时间序列(数据分析)
  15. matlab投资组合权重,马科维茨投资组合理论(均方模型)学习笔记――基于Matlab(四)...
  16. 2017 ECNA Regional Contest-G:Question of Ingestion(dp)
  17. 科研论文翻译软件|无广告|强力推荐
  18. 前端培训,丁鹿学堂和达内浅析
  19. 2014年计算机专业考研大纲,2014计算机考研大纲全面解析
  20. Mikrotik ROS软路由设置上网方式(二)

热门文章

  1. 通讯录软件测试初学者,通过实例学VB—创建简单的个人通讯录
  2. 现代关系型电子表格Grist
  3. 铁甲雄心机器人冠军_如何评价机器人格斗节目《铁甲雄心》?
  4. 网络管理软件在高校网络中的应用
  5. 抱抱脸(hugging face)教程-中文翻译-预处理
  6. 从零搭建 webpack4+react 脚手架
  7. 使用Python语言求s=a+aa+aaa+aaaa+aa...a的值
  8. 阿甘的巧克力盒子: 手机视频文件格式解析之 3GP/MP4
  9. 解决vue的{__ob__: observer}取值问题
  10. 《论文阅读》Neural Approaches to Conversational AI(1)