网上找的源码,用VC实现文件的打印,但是有点bug,添加了注释,如果有人能解决这几个bug,请告诉我一声。代码如下:

/*功能:打印任何浏览器能打开的本地文件,并实现打印功能@sURL: 要打印的文件路径(只能打开本地文件)bug: 测试了下,如果网页有脚本错误或被浏览器拦截了插件,则打印出来的内容可能为空,不知道有什么好的解决办法吗?另外,对于网页上的页面无效果(不会打印出文件来)
*/
BOOL Print_html(const char *sURL)
{HRESULT hr;CLSID clsid;  IUnknown     *pUnknown = NULL;  IWebBrowser2 *pWebBrowser2 = NULL;  IOleCommandTarget* pCommandTarget = NULL;  IDispatch *pDispatch = NULL;VARIANT va;  OLECHAR sOleChar[MAX_PATH];  CoInitialize(NULL);  CLSIDFromProgID(L"InternetExplorer.Application", &clsid);  hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (void  **)&pUnknown);if (SUCCEEDED(hr))  {hr = pUnknown->QueryInterface(IID_IWebBrowser2, (void **)&pWebBrowser2);if (SUCCEEDED(hr)){  VariantInit(&va);  va.vt = VT_I4;  va.lVal = 0;  MultiByteToWideChar(CP_ACP, 0, sURL, -1, sOleChar, sizeof sOleChar);  BSTR bstrURL = SysAllocString(sOleChar);  hr = pWebBrowser2->Navigate(bstrURL, &va, &va, &va, &va);SysFreeString (bstrURL);hr = pWebBrowser2->get_Document(&pDispatch);if (SUCCEEDED(hr))  {  hr =  pDispatch->QueryInterface(IID_IOleCommandTarget,(void**)&pCommandTarget);  if (SUCCEEDED(hr))  {  hr = pCommandTarget->Exec(NULL, OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);Sleep(2000);pCommandTarget->Release();}  else  {  pDispatch->Release();pWebBrowser2->Release();pUnknown->Release();  CoUninitialize();  return FALSE;}  pDispatch->Release();  }  else{  pWebBrowser2->Release();  pUnknown->Release();  CoUninitialize();  return FALSE;}  pWebBrowser2->Release();  }else{pUnknown->Release();  CoUninitialize();  return FALSE;}  pUnknown->Release();  }  else{CoUninitialize();  return FALSE;}CoUninitialize();  return TRUE;
}//是否打印页眉、页脚
//i_sign: 0-打印
//    1-不打印
BOOL Print_header_footer(int i_sign)
{const int KEY_LEN = 100;char lp_header[KEY_LEN];char lp_footer[KEY_LEN];char *str_keyname = "Software\\Microsoft\\Internet Explorer\\PageSetup\\";HKEY hKey;int err;if(RegOpenKeyEx(HKEY_CURRENT_USER,str_keyname,0,KEY_WRITE,&hKey) != ERROR_SUCCESS){err = GetLastError();return FALSE;}if(i_sign == 0){memset(lp_header,0,sizeof(lp_header));memset(lp_footer,0,sizeof(lp_footer));strcpy(lp_header,"&w&b页码,&p/&P"); //"&w&b页码,&p/&P";strcpy(lp_footer,"&u&b&d");    //"&u&b&d";if(RegSetValueEx(hKey, "header", 0, REG_SZ, (const unsigned char *)lp_header, strlen(lp_header))!=ERROR_SUCCESS){RegCloseKey(hKey);return FALSE;}if(RegSetValueEx(hKey, "footer", 0, REG_SZ, (const unsigned char *)lp_footer, strlen(lp_footer))!=ERROR_SUCCESS){RegCloseKey(hKey);return FALSE;}RegCloseKey(hKey);return TRUE;}if(i_sign == 1){memset(lp_header,0,sizeof(lp_header));memset(lp_footer,0,sizeof(lp_footer));if(RegSetValueEx(hKey, "header", 0, REG_SZ, (const unsigned char *)lp_header, strlen(lp_header))!=ERROR_SUCCESS){RegCloseKey(hKey);return FALSE;}if(RegSetValueEx(hKey, "footer", 0, REG_SZ, (const unsigned char *)lp_footer, strlen(lp_footer))!=ERROR_SUCCESS){RegCloseKey(hKey);return FALSE;}RegCloseKey(hKey);return TRUE;}return TRUE;
}

经测试,Print_Html只对本地文件有效,对于输入的网址,不会产生任何打印文件。而且本地的文件不能有脚本错误,要不然,有可能打印出来的文件内容为空。

这个代码的原理是利用流利器打开一个文件,再利用浏览器菜单中的打印功能来实现文件打印的。所以如果你不是用微软默认的Internet Explorer.exe的话,可能无法实现文件打印,因此必须将IE浏览器设置为默认的浏览器才可以噢!

vc实现文件的打印--BOOL Print_html(const char *sURL)相关推荐

  1. VC++判断文件或文件夹是否存在(转)

    VC++判断文件或文件夹是否存在 在Windows应用项目中,几乎总会需要用到一些文件系统相关的函数,如:判断文件是否存在,判断文件夹是否为空,删除文件夹及其所有子项,计算文件夹的大小,等等.不知为何 ...

  2. VC++ 实现文件与应用程序关联

    日常工作中,doc文件直接双击后,就能启动word软件,并读取该文档的内容在软件中显示,这都得益于注册表的配置,我们的软件也需要实现这样的功能,该如何写注册表以及写入哪些内容呢?下面的两个函数就能实现 ...

  3. VC语言文件正文分析器--支持格式常用文件格式

    Graccvs文件正文提取开发组件支持各种文件提取正文,为OA,ERP,CRM系统使用文件提供文件正文使用和搜索,支持常见各种文件格式".pdf", ".doc" ...

  4. 【转】VC++ MFC文件的移动复制删除更名遍历操作

    1.判断文件是否存在 利用CFile类和CFileStatus类判断 CFileStatus filestatus; if (CFile::GetStatus(_T("d://softist ...

  5. DbgView软件 查看VC++ MFC 程序的打印信息

    DbgView软件 查看VC++ MFC 程序的打印信息 一.在写VC++ MFC程序的调制过程中,需要跟踪打印信息,但在MFC中用printf不知道在哪里看打印信息,今天介绍一款软件,可以查看对应的 ...

  6. Android:Android NDK项目中C++文件中打印日志

    Android NDK项目中C++文件中打印日志 工作需要,在NDK项目中的C++文件中打印日志,还是费了点劲查找 才达到自己 想要的效果了. 步骤 添加头文件 添加头文件 定义宏函数 #includ ...

  7. VC 实现文件夹属性的获取与更改

    VC 实现文件夹属性的获取与更改 - VC 引言: 对于大多数的IT企业和绝大多数的个人用户而言,数据的备份主要是对数据内容的简单备份,而很少涉及对备份数据自身属性如文件属性.所在文件夹的时间属性等内 ...

  8. 【转载】VC遍历文件夹下所有文件和文件夹

    2019独角兽企业重金招聘Python工程师标准>>> 一.先介绍一个结构WIN32_FIND_DATA VC遍历文件夹下所有文件和文件夹 typedef struct _WIN32 ...

  9. wps js宏实战案例:批量汇总订单数据、识别黑名单、自动统计业绩、每笔订单生成带条形码的发货单并输出为pdf文件用于打印

    wps js支持ES6语法,对比vba能节省非常多的代码量,不过缺点也很明显,wps js环境暂时不支持调用win系统组件和第三方控件.小声比比:可能有调用的方法,只是我没发现. 基本需求: 可以选择 ...

  10. c 打印html文档,C# C/S程序使用HTML文件作为打印模板

    C#   C/S程序使用HTML文件作为打印模板 在网上找了一堆的资料,整理到郁闷呀,慢慢试慢慢改,哎,终于成功了,哈,菜鸟伤不起呀 public partial class Print : Form ...

最新文章

  1. 云计算介绍 、TCP/IP协议及配置
  2. XDU 翼讯账号算法
  3. PXE自动化装机(4)
  4. 什么是最重要的事情?来自长辈的教诲
  5. 高效的 JavaScript
  6. work hard, think harder
  7. 不是python文件处理seek()方法的参数是_python文件操作seek()偏移量,读取指正到指定位置操作...
  8. c语言编程计算平分,用C语言编程平均分数
  9. 顺风车Android性能优化之View布局优化
  10. SQL 2008 R2密钥
  11. Go 语言圣经-习题汇总(Go 程序设计语言/The Go Programming Language)
  12. bcdedit无法打开启
  13. 隐马尔科夫模型(二)
  14. Laravel框架之微信授权获取用户信息
  15. 服务器发电子邮件,服务器拒绝接受发件人的电子邮件地址,这封邮件无法发送...
  16. EXCEL地理工具--小O地图EXCEL插件0705版 2022.4.28发布
  17. 第二型曲面积分的定义
  18. Python3 面向对象基础1
  19. 提问的艺术:如何快速获得答案
  20. 读书笔记:《机器人SLAM导航核心技术与实战》导读

热门文章

  1. 消防管件做的机器人图片_看图猜管件
  2. impala查询语句_impala 下的SQL操作
  3. ubuntu使用pytorch训练出现killed_目标检测之pytorch预训练模型的使用(削减削减网络层,修改参数)fine-tune技巧...
  4. java分布式集群框架_Cacheonix——Java的分布式集群缓存框架
  5. ADT 使用和问题总结
  6. Flutter 《从0到1构建大前端应用》-所有知识点架构
  7. 7-7 找最小的字符串 (15 分)
  8. 【文文殿下】APIO2019游记
  9. IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证
  10. Boundary Representations