| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #include "pch.h"
- #include "WebPage.h"
- #define CHECK_POINTER(p)\
- ATLASSERT(p != NULL);\
- if(p == NULL)\
- {\
- ShowError("NULL pointer");\
- return false;\
- }
- 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()
- {
- }
- 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);
- 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 = (int)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 _T("");
- CString strFunc = GetNextToken(strSrc, _T("("), true);
- CString strArgs = GetNextToken(strSrc, _T(")"), true);
- // Parse arguments
- CString strArg;
- while (!(strArg = GetNextToken(strArgs, _T(","))).IsEmpty())
- args.Add(strArg);
- strAText = strSrc;
- return strFunc;
- }
|