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浏览器设置为默认的浏览器才可以噢!

你可能感兴趣的:(Const)