@@ -533,7 +533,7 @@ STDMETHODIMP CteBase::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
533533
534534STDMETHODIMP CteBase::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
535535{
536- CHAR pszName[9 ];
536+ CHAR pszName[9 ] = { 0 } ;
537537 for (int i = 0 ;; ++i) {
538538 WCHAR wc = rgszNames[0 ][i];
539539 if (i == _countof (pszName) - 1 || wc < ' 0' || wc > ' z' ) {
@@ -754,13 +754,13 @@ STDMETHODIMP CteBase::put_Height(long Height)
754754
755755STDMETHODIMP CteBase::get_LocationName (BSTR *LocationName)
756756{
757- *LocationName = ::SysAllocString (m_bstrPath);
757+ *LocationName = ::SysAllocString (m_bstrPath ? m_bstrPath : L" " );
758758 return S_OK ;
759759}
760760
761761STDMETHODIMP CteBase::get_LocationURL (BSTR *LocationURL)
762762{
763- *LocationURL = ::SysAllocString (m_bstrPath);
763+ *LocationURL = ::SysAllocString (m_bstrPath ? m_bstrPath : L" " );
764764 return S_OK ;
765765}
766766
@@ -773,7 +773,7 @@ STDMETHODIMP CteBase::get_Busy(VARIANT_BOOL *pBool)
773773// IWebBrowserApp
774774STDMETHODIMP CteBase::Quit (void )
775775{
776- return m_webviewWindow->Stop ();
776+ return m_webviewWindow ? m_webviewWindow ->Stop () : E_NOINTERFACE ;
777777}
778778
779779STDMETHODIMP CteBase::ClientToWindow (int *pcx, int *pcy)
@@ -799,6 +799,9 @@ STDMETHODIMP CteBase::PutProperty(BSTR Property, VARIANT vtValue)
799799STDMETHODIMP CteBase::GetProperty (BSTR Property, VARIANT *pvtValue)
800800{
801801 if (lstrcmpi (Property, L" InvokeMethod" ) == 0 ) {
802+ if (!m_webviewWindow) {
803+ return E_NOINTERFACE ;
804+ }
802805 BSTR bs = ::SysAllocString (L" _InvokeMethod();" );
803806 m_webviewWindow->ExecuteScript (bs, this );
804807 teSysFreeString (&bs);
@@ -813,8 +816,12 @@ STDMETHODIMP CteBase::GetProperty(BSTR Property, VARIANT *pvtValue)
813816
814817STDMETHODIMP CteBase::get_Name (BSTR *Name)
815818{
816- *Name = ::SysAllocStringLen (L" WebView2/" , lstrlen (g_versionInfo) + 9 );
817- lstrcat (*Name, g_versionInfo);
819+ if (!g_versionInfo) {
820+ return E_NOINTERFACE ;
821+ }
822+ int nLen = lstrlen (g_versionInfo);
823+ *Name = ::SysAllocStringLen (L" WebView2/" , nLen + 9 );
824+ StrNCpy (*Name + 9 , g_versionInfo, nLen);
818825 return S_OK ;
819826}
820827
@@ -1217,6 +1224,9 @@ STDMETHODIMP CteBase::UIDeactivate(void)
12171224
12181225STDMETHODIMP CteBase::SetObjectRects (LPCRECT lprcPosRect, LPCRECT lprcClipRect)
12191226{
1227+ if (!m_webviewController) {
1228+ return E_NOINTERFACE ;
1229+ }
12201230 RECT bounds;
12211231 if (!lprcPosRect) {
12221232 GetClientRect (m_hwndParent, &bounds);
@@ -1364,11 +1374,11 @@ STDMETHODIMP CteBase::QueryService(REFGUID guidService, REFIID riid, void **ppv)
13641374{
13651375 if (IsEqualGUID (guidService, SID_TablacusObject)) {
13661376 *ppv = new CteObjectEx ();
1367- return S_OK ;
1377+ return *ppv ? S_OK : E_OUTOFMEMORY ;
13681378 }
13691379 if (IsEqualGUID (guidService, SID_TablacusArray)) {
13701380 *ppv = new CteArray ();
1371- return S_OK ;
1381+ return *ppv ? S_OK : E_OUTOFMEMORY ;
13721382 }
13731383 if (IsEqualIID (riid, IID_IShellBrowser)) {
13741384 return QueryInterface (riid, ppv);
@@ -1379,6 +1389,9 @@ STDMETHODIMP CteBase::QueryService(REFGUID guidService, REFIID riid, void **ppv)
13791389// ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler
13801390STDMETHODIMP CteBase::Invoke (HRESULT result, ICoreWebView2Environment *created_environment)
13811391{
1392+ if (FAILED (result) || !created_environment) {
1393+ return result;
1394+ }
13821395 created_environment->CreateCoreWebView2Controller (m_hwndParent, this );
13831396#ifdef USE_DRAGDROP
13841397 created_environment->QueryInterface (IID_PPV_ARGS (&m_webviewEnvironment3));
@@ -1389,6 +1402,9 @@ STDMETHODIMP CteBase::Invoke(HRESULT result, ICoreWebView2Environment *created_e
13891402// ICoreWebView2CreateCoreWebView2ControllerCompletedHandler
13901403STDMETHODIMP CteBase::Invoke (HRESULT result, ICoreWebView2Controller *createdController)
13911404{
1405+ if (FAILED (result) || !createdController) {
1406+ return result;
1407+ }
13921408 createdController->QueryInterface (IID_PPV_ARGS (&m_webviewController));
13931409 m_webviewController->get_CoreWebView2 (&m_webviewWindow);
13941410 ICoreWebView2Settings* Settings;
@@ -1398,6 +1414,7 @@ STDMETHODIMP CteBase::Invoke(HRESULT result, ICoreWebView2Controller *createdCon
13981414 Settings->put_AreDefaultScriptDialogsEnabled (TRUE );
13991415 Settings->put_IsWebMessageEnabled (TRUE );
14001416 Settings->put_IsStatusBarEnabled (FALSE );
1417+ SafeRelease (&Settings);
14011418 if (m_pOleClientSite) {
14021419 IDocHostUIHandler *pDocHostUIHandler;
14031420 if SUCCEEDED (m_pOleClientSite->QueryInterface (IID_PPV_ARGS (&pDocHostUIHandler))) {
@@ -1676,14 +1693,18 @@ STDMETHODIMP CteArray::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD
16761693 if (pVarResult) {
16771694 LONG l = 0 ;
16781695 ::SafeArrayGetElement (m_psa, &l, pVarResult);
1696+ } else {
1697+ VARIANT vTmp;
1698+ LONG l = 0 ;
1699+ ::SafeArrayGetElement (m_psa, &l, &vTmp);
1700+ ::VariantClear (&vTmp);
16791701 }
16801702 VARIANT *pv;
16811703 if (::SafeArrayAccessData (m_psa, (LPVOID *)&pv) == S_OK ) {
1682- ::VariantClear (pv);
1683- ::CopyMemory (pv, &pv[1 ], sizeof (VARIANT ) * --n);
1684- ::VariantInit (&pv[n]);
1704+ ::MoveMemory (pv, &pv[1 ], sizeof (VARIANT ) * (n - 1 ));
1705+ ::VariantInit (&pv[n - 1 ]);
16851706 ::SafeArrayUnaccessData (m_psa);
1686- SAFEARRAYBOUND sab = { (ULONG )n, 0 };
1707+ SAFEARRAYBOUND sab = { (ULONG )n - 1 , 0 };
16871708 ::SafeArrayRedim (m_psa, &sab);
16881709 }
16891710 }
@@ -1749,11 +1770,11 @@ STDMETHODIMP CteArray::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD
17491770
17501771 case TE_METHOD + 6 :// Slice
17511772 case TE_METHOD + 7 :// Splice
1752- CteArray *pNewArray;
1753- if (pVarResult) {
1754- pNewArray = new CteArray ();
1755- }
17561773 if (nArg >= 0 ) {
1774+ CteArray *pNewArray = NULL ;
1775+ if (pVarResult) {
1776+ pNewArray = new CteArray ();
1777+ }
17571778 LONG nStart = GetIntFromVariant (&pDispParams->rgvarg [nArg]);
17581779 LONG nLen = nArg >= 1 ? GetIntFromVariant (&pDispParams->rgvarg [nArg - 1 ]) : MAXINT ;
17591780 if (nStart > GetCount () - nLen) {
@@ -1787,6 +1808,8 @@ STDMETHODIMP CteArray::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD
17871808 sab = { (ULONG )n - nLen, 0 };
17881809 ::SafeArrayRedim (m_psa, &sab);
17891810 }
1811+ } else if (pVarResult) {
1812+ teSetObjectRelease (pVarResult, new CteArray ());
17901813 }
17911814 return S_OK ;
17921815
@@ -1865,8 +1888,8 @@ STDMETHODIMP CteArray::GetMemberProperties(DISPID id, DWORD grfdexFetch, DWORD *
18651888STDMETHODIMP CteArray::GetMemberName (DISPID id, BSTR *pbstrName)
18661889{
18671890 if (id >= DISPID_COLLECTION_MIN && id < DISPID_COLLECTION_MIN + GetCount ()) {
1868- wchar_t pszName[8 ];
1869- swprintf_s (pszName, 8 , L" %d" , id - DISPID_COLLECTION_MIN );
1891+ wchar_t pszName[16 ];
1892+ swprintf_s (pszName, 16 , L" %d" , id - DISPID_COLLECTION_MIN );
18701893 *pbstrName = ::SysAllocString (pszName);
18711894 return S_OK ;
18721895 }
@@ -1973,8 +1996,11 @@ STDMETHODIMP CteObjectEx::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT c
19731996 auto itr = m_umIndex.find (*rgszNames);
19741997 if (itr == m_umIndex.end ()) {
19751998 *rgDispId = m_dispId;
1999+ if (m_dispId >= TE_PROPERTY ) {
2000+ return DISP_E_UNKNOWNNAME ;
2001+ }
19762002 m_umIndex[*rgszNames] = m_dispId++;
1977- return (m_dispId < TE_PROPERTY ) ? S_OK : DISP_E_UNKNOWNNAME ;
2003+ return S_OK ;
19782004 }
19792005 *rgDispId = itr->second ;
19802006 return S_OK ;
0 commit comments