vc实现文件的打印--BOOL Print_html(const char *sURL)
2010-11-07 16:51
671 查看
网上找的源码,用VC实现文件的打印,但是有点bug,添加了注释,如果有人能解决这几个bug,请告诉我一声。代码如下:
经测试,Print_Html只对本地文件有效,对于输入的网址,不会产生任何打印文件。而且本地的文件不能有脚本错误,要不然,有可能打印出来的文件内容为空。
这个代码的原理是利用流利器打开一个文件,再利用浏览器菜单中的打印功能来实现文件打印的。所以如果你不是用微软默认的Internet Explorer.exe的话,可能无法实现文件打印,因此必须将IE浏览器设置为默认的浏览器才可以噢!
/* 功能:打印任何浏览器能打开的本地文件,并实现打印功能 @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浏览器设置为默认的浏览器才可以噢!
相关文章推荐
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” from http://www.cnblogs.com/moon2bird/archive/2009/02/27/1399675.html
- 在html中如.html .psp文件打印调试信息用req.write( “ ”);在python中如.py文件打印用print
- 简单的jQuery.jqprint插件实现打印HTML页面,页面导出为PDF文件
- 利用VC++实现AVI文件的合成和分解
- 利用VC++实现AVI文件的合成和分解
- 将Office(如:Word、Excel、PPT 等)文件转html(通过OpenOffice实现)
- python实现合并两个文件并打印输出
- vc实现用文件系统过滤驱动实现文件隐藏的类
- VC实现BMP位图文件结构及平滑缩放
- VC++实现host文件读写
- vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序
- VC中int,char,char*,const char*,string等类型转换(转载)
- webuploader+springmvc实现多文件上传(html+js+css原创,后台代码借鉴)
- 配置实现-打印(生成静态html)使用
- VC实现文件拖拽OnDropFiles
- VC2008中将CString转换成const char*的一种有效方法
- VC实现删除文件到回收站
- VC++对话框程序打印及打印预览的实现