网页google地图加载(一)

来源:互联网 发布:汽车行业cae软件 编辑:程序博客网 时间:2024/05/17 19:16


CMyHtmlView       m_web;//CHtmlView类的子类
 CWebPage          m_webPage;

//创建控件,加载google网址

//下面是调用不完整的接口。。需自己实现

。。。。。。。。

//CWebPage这个类可以网上自己下载实现一些自己需要的功能。


CHtmlView该类重写:

构造和虚构函数访问属性改为公有。

//下面这个函数功能是屏蔽在无网络的情况下,弹出的错误提示对话框

void CMyHtmlView::OnNavigateComplete2(LPCTSTR strURL)
{
 // TODO:  在此添加专用代码和/或调用基类
 CComPtr<IDispatch>   spDisp = GetHtmlDocument();
 if (spDisp != NULL)
 {
  CComPtr<IHTMLDocument2> doc;
  spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
  if (doc != NULL)
  {
   IHTMLWindow2 * pIhtmlwindow2 = NULL;
   doc->get_parentWindow(&pIhtmlwindow2);
   if (pIhtmlwindow2 != NULL)
   {//"function fnOnError(msg,url,lineno){alert('script error:\\n\\nURL:'+url+'\\n\\nMSG:'+msg +'\\n\\nLine:'+lineno);return true;}window.onerror=fnOnError;";
    //屏蔽javascript脚本错误的javascript脚本
    CString strJavaScriptCode = _T("function fnOnError(){return true;}window.onerror=fnOnError;");
    BSTR bstrScript = strJavaScriptCode.AllocSysString();
    CString strLanguage(_T("JavaScript"));
    BSTR bstrLanguage = strLanguage.AllocSysString();
    long lTime = 1 * 1000;
    long lTimeID = 0;
    VARIANT varLanguage;
    varLanguage.vt = VT_BSTR;
    varLanguage.bstrVal = bstrLanguage;
    VARIANT pRet;
    //把window.onerror函数插入入当前页面中去
    pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
    ::SysFreeString(bstrScript);
    ::SysFreeString(bstrLanguage);
    pIhtmlwindow2->Release();
   }
  }
 }

 CHtmlView::OnNavigateComplete2(strURL);
}




// WebPage.h: interface for the CWebPage class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WEBPAGE_H__AEBD50B8_EE66_40AB_8B92_C4EECB9BCD22__INCLUDED_)
#define AFX_WEBPAGE_H__AEBD50B8_EE66_40AB_8B92_C4EECB9BCD22__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <atlbase.h>
#include <Mshtml.h>

class CWebPage 
{
public:
 CWebPage();
 virtual ~CWebPage();

 bool SetDocument(IDispatch* pDisp);
 LPDISPATCH GetHtmlDocument() const;
 const CString GetLastError() const;
 bool GetJScript(CComPtr<IDispatch>& spDisp);
 bool GetJScripts(CComPtr<IHTMLElementCollection>& spColl);

 CString ScanJScript(CString& strAText, CStringArray& args);

 bool CallJScript(const CString strFunc,CComVariant* pVarResult = NULL);
 bool CallJScript(const CString strFunc,const CString strArg1,CComVariant* pVarResult = NULL);
 bool CallJScript(const CString strFunc,const CString strArg1,const CString strArg2,CComVariant* pVarResult = NULL);
 bool CallJScript(const CString strFunc,const CString strArg1,const CString strArg2,const CString strArg3,CComVariant* pVarResult = NULL);
 bool CallJScript(const CString strFunc,const CStringArray& paramArray,CComVariant* pVarResult = NULL);

protected:


 void ShowError(LPCSTR lpszText);

protected:

 CComPtr<IHTMLDocument2> m_spDoc;
 CString m_strError;

};

inline
void CWebPage::ShowError(LPCSTR lpszText)
{
 m_strError = _TEXT("JSCall Error:\n") + CString(lpszText);
}
inline
const CString CWebPage::GetLastError() const
{
 return m_strError;
}
inline
LPDISPATCH CWebPage::GetHtmlDocument() const
{
 return m_spDoc;
}

CString GetNextToken(CString& strSrc, const CString strDelim,bool bTrim = false, bool bFindOneOf = true);

#endif // !defined(AFX_WEBPAGE_H__AEBD50B8_EE66_40AB_8B92_C4EECB9BCD22__INCLUDED_)


***********************************************************************************************************************************************

/////////////////////////////////////////////////////////////////
//             By Eugene Khodakovsky                           //
//                  April,2002                                 //
//             Eugene@cpplab.com                               //
//            Last Update: April, 2002                         //
/////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "JSCall.h"
#include "WebPage.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define CHECK_POINTER(p)\
 ATLASSERT(p != NULL);\
 if(p == NULL)\
 {\
  ShowError("NULL pointer");\
  return false;\
 }

const CString GetSystemErrorMessage(DWORD dwError)
{
 CString strError;
 LPTSTR lpBuffer;

 if(!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
   NULL,  dwError,
   MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
   (LPTSTR) &lpBuffer, 0, NULL))

 {
  strError = "FormatMessage Netive Error" ;
 }
 else
 {
  strError = lpBuffer;
  LocalFree(lpBuffer);
 }
 return strError;
}

CString GetNextToken(CString& strSrc, const CString strDelim,bool bTrim, bool bFindOneOf)
{
 CString strToken;
 int idx = bFindOneOf? strSrc.FindOneOf(strDelim) : strSrc.Find(strDelim);
 if(idx != -1)
 {
  strToken  = strSrc.Left(idx);
  strSrc = strSrc.Right(strSrc.GetLength() - (idx + 1) );
 }
 else
 {
  strToken = strSrc;
  strSrc.Empty();
 }
 if(bTrim)
 {
  strToken.TrimLeft();
  strToken.TrimRight();
 }
 return strToken;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWebPage::CWebPage()
{
 m_spDoc = NULL;
}

CWebPage::~CWebPage()
{

}

bool CWebPage::SetDocument(IDispatch* pDisp)
{
 CHECK_POINTER(pDisp);

 m_spDoc = NULL;

 CComPtr<IDispatch> spDisp = pDisp;

 HRESULT hr = spDisp->QueryInterface(IID_IHTMLDocument2,(void**)&m_spDoc);
 if(FAILED(hr))
 {
  ShowError("Failed to get HTML document COM object");
  return false;
 }
 return true;
}

bool CWebPage::GetJScript(CComPtr<IDispatch>& spDisp)
{
 CHECK_POINTER(m_spDoc);
 HRESULT hr = m_spDoc->get_Script(&spDisp);
//  CString str;
//  m_spDoc->toString(str);
 ATLASSERT(SUCCEEDED(hr));
 return SUCCEEDED(hr);
}

bool CWebPage::GetJScripts(CComPtr<IHTMLElementCollection>& spColl)
{
 CHECK_POINTER(m_spDoc);
 HRESULT hr = m_spDoc->get_scripts(&spColl);
 ATLASSERT(SUCCEEDED(hr));
 return SUCCEEDED(hr);
}

bool CWebPage::CallJScript(const CString strFunc,CComVariant* pVarResult)
{
 CStringArray paramArray;
 return CallJScript(strFunc,paramArray,pVarResult);
}

bool CWebPage::CallJScript(const CString strFunc,const CString strArg1,CComVariant* pVarResult)
{
 CStringArray paramArray;
 paramArray.Add(strArg1);
 return CallJScript(strFunc,paramArray,pVarResult);
}

bool CWebPage::CallJScript(const CString strFunc,const CString strArg1,const CString strArg2,CComVariant* pVarResult)
{
 CStringArray paramArray;
 paramArray.Add(strArg1);
 paramArray.Add(strArg2);
 return CallJScript(strFunc,paramArray,pVarResult);
}

bool CWebPage::CallJScript(const CString strFunc,const CString strArg1,const CString strArg2,const CString strArg3,CComVariant* pVarResult)
{
 CStringArray paramArray;
 paramArray.Add(strArg1);
 paramArray.Add(strArg2);
 paramArray.Add(strArg3);
 return CallJScript(strFunc,paramArray,pVarResult);
}

bool CWebPage::CallJScript(const CString strFunc, const CStringArray& paramArray,CComVariant* pVarResult)
{
 CComPtr<IDispatch> spScript;
 if(!GetJScript(spScript))
 {
  ShowError("Cannot GetScript");
  return false;
 }
 CComBSTR bstrMember(strFunc);
 DISPID dispid = NULL;
 HRESULT hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,
           LOCALE_SYSTEM_DEFAULT,&dispid);
 if(FAILED(hr))
 {
  //ShowError(GetSystemErrorMessage(hr));
  return false;
 }
 
 const int arraySize = paramArray.GetSize();

 DISPPARAMS dispparams;
 memset(&dispparams, 0, sizeof dispparams);
 dispparams.cArgs = arraySize;
 dispparams.rgvarg = new VARIANT[dispparams.cArgs];
 
 for( int i = 0; i < arraySize; i++)
 {
  CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // back reading
  bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
  dispparams.rgvarg[i].vt = VT_BSTR;
 }
 dispparams.cNamedArgs = 0;

 EXCEPINFO excepInfo;
 memset(&excepInfo, 0, sizeof excepInfo);
    CComVariant vaResult;
 UINT nArgErr = (UINT)-1;  // initialize to invalid arg
        
 hr = spScript->Invoke(dispid,IID_NULL,0,
       DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);

 delete [] dispparams.rgvarg;
 if(FAILED(hr))
 {
//  ShowError(GetSystemErrorMessage(hr));
  return false;
 }
 
 if(pVarResult)
 {
  *pVarResult = vaResult;
 }
 return true;
}

// returned java script function name, input string is truncating
CString CWebPage::ScanJScript(CString& strAText, CStringArray& args)
{
 args.RemoveAll();
 CString strDelim(" \n\r\t"),strSrc(strAText);
 bool bFound = false;
 while(!strSrc.IsEmpty())
 {
  CString strStart = GetNextToken(strSrc,strDelim);
  if(strStart == "function")
  {
   bFound = true;
   break;
  }
  if(strStart == "/*")
  {
   // Skip comments
   while(!strSrc.IsEmpty())
   {
    CString strStop = GetNextToken(strSrc,strDelim);
    if(strStop == "*/")
    {
     break;
    }
   }
  }
 }

 if(!bFound)
  return _TEXT("");
 
 CString strFunc = GetNextToken(strSrc,_TEXT("("),true);
 CString strArgs = GetNextToken(strSrc,_TEXT(")"),true);

 // Parse arguments
 CString strArg;
 while(!(strArg = GetNextToken(strArgs,_TEXT(","))).IsEmpty())
  args.Add(strArg);

 strAText= strSrc;
 return strFunc;
}







0 0
原创粉丝点击