#include "stdafx.h" #include "libwebbrowser.h" #include "CWebBrowserDlg.h" // ´íÎóö¾Ù enum ErrorCodeEnum { Error_Succeed = 0, Error_ThreadTimeOut, Error_Param, Error_Unexpect }; class libwebbrowser_impl { public: libwebbrowser_impl(CPrintHostApi *pHostApi, IWebPrintCallBack *pICallBack): m_pDlg(NULL), m_pHostApi(NULL), m_pICallBack(NULL) { m_pHostApi = pHostApi; m_pICallBack = pICallBack; // Æô¶¯WebBrowser¶Ô»°¿ò ErrorCodeEnum Error = CreateWBDialog(); if (Error == Error_Succeed) { m_pHostApi->Debug("Succeed to create WebBrowserDlg!"); } else if (Error == Error_ThreadTimeOut) { m_pHostApi->Debug("Fail to create WebBrowserDlg: Error_ThreadTimeOut!"); } else if (Error == Error_Unexpect) { m_pHostApi->Debug("Fail to create WebBrowserDlg: Error_Unexpect!"); } } ~libwebbrowser_impl() { m_pHostApi = NULL; m_pICallBack = NULL; } BOOL LoadPage(const char* szURL) { m_pHostApi->Debug("[Web Print] load %s", szURL); LRESULT ret = ::SendMessage(m_pDlg->GetSafeHwnd(), WM_LOADURLMESSAGE, NULL, (LPARAM)szURL); return TRUE; } BOOL PrintPage() { //LRESULT ret = ::SendMessage(m_pDlg->GetSafeHwnd(), WM_PRINTMESSAGE, NULL, NULL); //return TRUE; return ::PostMessage(m_pDlg->GetSafeHwnd(), WM_PRINTMESSAGE, NULL, NULL); } BOOL Exit() { if (m_pDlg && m_hThread) { ::PostMessage(m_pDlg->GetSafeHwnd(), WM_CLOSE, NULL, NULL); WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_hThread); m_hThread = NULL; m_pHostApi->Debug("lytest WebBrowserDlg closed."); } return TRUE; } void BrowserDlg() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_pDlg = new CWebBrowserDlg(m_pHostApi, m_pICallBack); m_pDlg->DoModal(); delete m_pDlg; m_pDlg = NULL; m_pHostApi->Debug("lytest WebBrowserDlg destroyed."); } static UINT WINAPI BrowserThreadProc(LPVOID param) { CoInitialize(NULL); libwebbrowser_impl *p = (libwebbrowser_impl*)param; p->BrowserDlg(); CoUninitialize(); return 0; } private: ErrorCodeEnum CreateWBDialog() { DWORD WaitInterval = 3000; h_WBCreateEvent = CreateEvent(NULL, FALSE, FALSE, _T("WBCreateEvent")); m_hThread = (HANDLE)_beginthreadex(NULL, 0, BrowserThreadProc, this, 0, &m_threadID); DWORD ret = WaitForSingleObject(h_WBCreateEvent, WaitInterval); CloseHandle(h_WBCreateEvent); h_WBCreateEvent = NULL; if (ret == WAIT_OBJECT_0) { return Error_Succeed; } else if (ret == WAIT_TIMEOUT) { return Error_ThreadTimeOut; } else if (ret == WAIT_FAILED) { return Error_Unexpect; } } private: CWebBrowserDlg *m_pDlg; CPrintHostApi *m_pHostApi; IWebPrintCallBack *m_pICallBack; // add by ly HANDLE m_hThread; UINT m_threadID; HANDLE h_WBCreateEvent; }; Clibwebbrowser::Clibwebbrowser(CPrintHostApi *pHostApi, IWebPrintCallBack *pICallBack) { m_pImpl = new libwebbrowser_impl(pHostApi, pICallBack); } Clibwebbrowser::~Clibwebbrowser() { if (m_pImpl != NULL) { delete m_pImpl; m_pImpl = NULL; } } BOOL Clibwebbrowser::LoadPage(const char* szURL) { return m_pImpl->LoadPage(szURL); } BOOL Clibwebbrowser::PrintPage() { return m_pImpl->PrintPage(); } BOOL Clibwebbrowser::Exit() { return m_pImpl->Exit(); }