zoukankan      html  css  js  c++  java
  • vc实现文件的打印--BOOL Print_html(const char *sURL)

    网上找的源码,用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浏览器设置为默认的浏览器才可以噢!

  • 相关阅读:
    MSSQL跨服务器插入
    TCP/IP详解 笔记一
    android学习十三 首选项
    android 学习十四 探索安全性和权限
    android学习十二 配置变化
    android学习十 ActionBar
    android学习十一 高级调试分析功能
    android学习九 对话框碎片
    android学习八 多用途碎片
    android学习七 菜单
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/1871144.html
Copyright © 2011-2022 走看看