WebPage.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. #include "pch.h"
  2. #include "WebPage.h"
  3. #define CHECK_POINTER(p)\
  4. ATLASSERT(p != NULL);\
  5. if(p == NULL)\
  6. {\
  7. ShowError("NULL pointer");\
  8. return false;\
  9. }
  10. CString GetSystemErrorMessage(DWORD dwError)
  11. {
  12. CString strError;
  13. LPTSTR lpBuffer;
  14. if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  15. NULL, dwError,
  16. MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
  17. (LPTSTR)&lpBuffer, 0, NULL))
  18. {
  19. strError = "FormatMessage Netive Error";
  20. }
  21. else
  22. {
  23. strError = lpBuffer;
  24. LocalFree(lpBuffer);
  25. }
  26. return strError;
  27. }
  28. CString GetNextToken(CString& strSrc, const CString strDelim, bool bTrim, bool bFindOneOf)
  29. {
  30. CString strToken;
  31. int idx = bFindOneOf ? strSrc.FindOneOf(strDelim) : strSrc.Find(strDelim);
  32. if (idx != -1)
  33. {
  34. strToken = strSrc.Left(idx);
  35. strSrc = strSrc.Right(strSrc.GetLength() - (idx + 1));
  36. }
  37. else
  38. {
  39. strToken = strSrc;
  40. strSrc.Empty();
  41. }
  42. if (bTrim)
  43. {
  44. strToken.TrimLeft();
  45. strToken.TrimRight();
  46. }
  47. return strToken;
  48. }
  49. //////////////////////////////////////////////////////////////////////
  50. // Construction/Destruction
  51. //////////////////////////////////////////////////////////////////////
  52. CWebPage::CWebPage()
  53. {
  54. }
  55. CWebPage::~CWebPage()
  56. {
  57. }
  58. bool CWebPage::SetDocument(IDispatch* pDisp)
  59. {
  60. CHECK_POINTER(pDisp);
  61. m_spDoc = NULL;
  62. CComPtr<IDispatch> spDisp = pDisp;
  63. HRESULT hr = spDisp->QueryInterface(IID_IHTMLDocument2, (void**)&m_spDoc);
  64. if (FAILED(hr))
  65. {
  66. ShowError("Failed to get HTML document COM object");
  67. return false;
  68. }
  69. return true;
  70. }
  71. bool CWebPage::GetJScript(CComPtr<IDispatch>& spDisp)
  72. {
  73. CHECK_POINTER(m_spDoc);
  74. HRESULT hr = m_spDoc->get_Script(&spDisp);
  75. ATLASSERT(SUCCEEDED(hr));
  76. return SUCCEEDED(hr);
  77. }
  78. bool CWebPage::GetJScripts(CComPtr<IHTMLElementCollection>& spColl)
  79. {
  80. CHECK_POINTER(m_spDoc);
  81. HRESULT hr = m_spDoc->get_scripts(&spColl);
  82. ATLASSERT(SUCCEEDED(hr));
  83. return SUCCEEDED(hr);
  84. }
  85. bool CWebPage::CallJScript(const CString strFunc, CComVariant* pVarResult)
  86. {
  87. CStringArray paramArray;
  88. return CallJScript(strFunc, paramArray, pVarResult);
  89. }
  90. bool CWebPage::CallJScript(const CString strFunc, const CString strArg1, CComVariant* pVarResult)
  91. {
  92. CStringArray paramArray;
  93. paramArray.Add(strArg1);
  94. return CallJScript(strFunc, paramArray, pVarResult);
  95. }
  96. bool CWebPage::CallJScript(const CString strFunc, const CString strArg1, const CString strArg2, CComVariant* pVarResult)
  97. {
  98. CStringArray paramArray;
  99. paramArray.Add(strArg1);
  100. paramArray.Add(strArg2);
  101. return CallJScript(strFunc, paramArray, pVarResult);
  102. }
  103. bool CWebPage::CallJScript(const CString strFunc, const CString strArg1, const CString strArg2, const CString strArg3, CComVariant* pVarResult)
  104. {
  105. CStringArray paramArray;
  106. paramArray.Add(strArg1);
  107. paramArray.Add(strArg2);
  108. paramArray.Add(strArg3);
  109. return CallJScript(strFunc, paramArray, pVarResult);
  110. }
  111. bool CWebPage::CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult)
  112. {
  113. CComPtr<IDispatch> spScript;
  114. if (!GetJScript(spScript))
  115. {
  116. ShowError("Cannot GetScript");
  117. return false;
  118. }
  119. CComBSTR bstrMember(strFunc);
  120. DISPID dispid = NULL;
  121. HRESULT hr = spScript->GetIDsOfNames(IID_NULL, &bstrMember, 1,
  122. LOCALE_SYSTEM_DEFAULT, &dispid);
  123. if (FAILED(hr))
  124. {
  125. //ShowError(GetSystemErrorMessage(hr));
  126. return false;
  127. }
  128. const int arraySize = (int)paramArray.GetSize();
  129. DISPPARAMS dispparams;
  130. memset(&dispparams, 0, sizeof dispparams);
  131. dispparams.cArgs = arraySize;
  132. dispparams.rgvarg = new VARIANT[dispparams.cArgs];
  133. for (int i = 0; i < arraySize; i++)
  134. {
  135. CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // back reading
  136. bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
  137. dispparams.rgvarg[i].vt = VT_BSTR;
  138. }
  139. dispparams.cNamedArgs = 0;
  140. EXCEPINFO excepInfo;
  141. memset(&excepInfo, 0, sizeof excepInfo);
  142. CComVariant vaResult;
  143. UINT nArgErr = (UINT)-1; // initialize to invalid arg
  144. hr = spScript->Invoke(dispid, IID_NULL, 0,
  145. DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);
  146. delete[] dispparams.rgvarg;
  147. if (FAILED(hr))
  148. {
  149. ///ShowError(GetSystemErrorMessage(hr));
  150. return false;
  151. }
  152. if (pVarResult)
  153. {
  154. *pVarResult = vaResult;
  155. }
  156. return true;
  157. }
  158. // returned java script function name, input string is truncating
  159. CString CWebPage::ScanJScript(CString& strAText, CStringArray& args)
  160. {
  161. args.RemoveAll();
  162. CString strDelim(" \n\r\t"), strSrc(strAText);
  163. bool bFound = false;
  164. while (!strSrc.IsEmpty())
  165. {
  166. CString strStart = GetNextToken(strSrc, strDelim);
  167. if (strStart == "function")
  168. {
  169. bFound = true;
  170. break;
  171. }
  172. if (strStart == "/*")
  173. {
  174. // Skip comments
  175. while (!strSrc.IsEmpty())
  176. {
  177. CString strStop = GetNextToken(strSrc, strDelim);
  178. if (strStop == "*/")
  179. {
  180. break;
  181. }
  182. }
  183. }
  184. }
  185. if (!bFound)
  186. return _T("");
  187. CString strFunc = GetNextToken(strSrc, _T("("), true);
  188. CString strArgs = GetNextToken(strSrc, _T(")"), true);
  189. // Parse arguments
  190. CString strArg;
  191. while (!(strArg = GetNextToken(strArgs, _T(","))).IsEmpty())
  192. args.Add(strArg);
  193. strAText = strSrc;
  194. return strFunc;
  195. }