Index: webkit/activex_shim/web_activex_site.cc |
=================================================================== |
--- webkit/activex_shim/web_activex_site.cc (revision 25626) |
+++ webkit/activex_shim/web_activex_site.cc (working copy) |
@@ -1,672 +0,0 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/activex_shim/web_activex_site.h" |
- |
-#include <exdisp.h> |
-#include <oaidl.h> |
-#include <shlguid.h> |
- |
-#include "base/string_util.h" |
-#include "webkit/activex_shim/activex_plugin.h" |
-#include "webkit/activex_shim/npp_impl.h" |
-#include "webkit/activex_shim/web_activex_container.h" |
- |
-namespace activex_shim { |
- |
-// WebActiveXSite |
-WebActiveXSite::WebActiveXSite() |
- : container_(NULL), |
- control_(NULL), |
- inplace_activated_(false), |
- has_capture_(false) { |
- rect_.left = 0; |
- rect_.top = 0; |
- rect_.right = 0; |
- rect_.bottom = 0; |
-} |
- |
-WebActiveXSite::~WebActiveXSite() { |
- // Don't do anything here. Do everything in FinalRelease. |
-} |
- |
-void WebActiveXSite::Init(WebActiveXContainer* container, IUnknown* control) { |
- DCHECK(control); |
- container_ = container; |
- control_.Attach(control); |
- dispatch_.QueryFrom(control); |
- ole_object_.QueryFrom(control); |
- inplace_object_.QueryFrom(control); |
- view_object_.QueryFrom(control); |
- inplace_object_windowless_.QueryFrom(control); |
-} |
- |
-void WebActiveXSite::FinalRelease() { |
- // We must release everything here instead of leaving it to the destructor. |
- // Otherwise crash is possible. |
- if (control_ != NULL) { |
- dispatch_.Release(); |
- view_object_.Release(); |
- inplace_object_windowless_.Release(); |
- if (inplace_object_ != NULL) { |
- if (inplace_activated_) { |
- // If we just deactivate without checking whether the control has been |
- // inplace activated, the control may behave irratically. Flash will |
- // decrease its reference count during deactivation. Thus causing |
- // crash when we try to release it later. |
- inplace_object_->InPlaceDeactivate(); |
- inplace_activated_ = false; |
- } |
- inplace_object_.Release(); |
- } |
- if (ole_object_ != NULL) { |
- ole_object_->SetClientSite(NULL); |
- ole_object_->Close(OLECLOSE_NOSAVE); |
- ole_object_.Release(); |
- } |
- long ref = control_.Detach()->Release(); |
- // It should be 0 otherwise we have incorrect ref counting. |
- // Shockwave is known to have ref counting problems. All other controls |
- // behave well. |
- DCHECK(ref == 0 || container_->plugin()->activex_type() |
- == ACTIVEX_SHOCKWAVE); |
- } |
-} |
- |
-HRESULT WebActiveXSite::ActivateControl( |
- int x, int y, int width, int height, |
- const std::vector<ControlParam>& params) { |
- DCHECK(control_); |
- |
- // Set the rect size of site first before SetClientSite. Otherwise the |
- // control may query the site for such information during SetClientSite. |
- rect_.left = x; |
- rect_.top = y; |
- rect_.right = rect_.left + width; |
- rect_.bottom = rect_.top + height; |
- |
- HRESULT hr; |
- if (ole_object_ != NULL) { |
- hr = ole_object_->SetClientSite(static_cast<IOleClientSite*>(this)); |
- if (FAILED(hr)) |
- return hr; |
- } |
- SetExtent(width, height); |
- |
- // Set initial properties. |
- ScopedComPtr<IPersistPropertyBag> persist_property_bag; |
- persist_property_bag.QueryFrom(control_); |
- ScopedComPtr<IPersistPropertyBag2> persist_property_bag2; |
- persist_property_bag2.QueryFrom(control_); |
- if (persist_property_bag2 != NULL || persist_property_bag != NULL) { |
- // Use property bag for initialization. This is the preferred way. |
- initial_params_ = params; |
- // Use bag2 first. |
- if (persist_property_bag2 != NULL) { |
- persist_property_bag2->InitNew(); |
- hr = persist_property_bag2->Load(this, NULL); |
- DCHECK(SUCCEEDED(hr)); |
- } else { |
- persist_property_bag->InitNew(); |
- hr = persist_property_bag->Load(this, NULL); |
- DCHECK(SUCCEEDED(hr)); |
- } |
- // We don't need this anymore. |
- initial_params_.clear(); |
- } else if (dispatch_ != NULL) { |
- // Use the dispatch interface to set the initial properties. This is |
- // less efficient for most controls. |
- for (unsigned int i = 0; i < params.size(); ++i) { |
- const ControlParam& param = params[i]; |
- VARIANT vtvalue; |
- // TODO(ruijiang): Think about type conversion. |
- vtvalue.vt = VT_BSTR; |
- vtvalue.bstrVal = SysAllocString(param.value.c_str()); |
- DispSetProperty(dispatch_, param.name.c_str(), vtvalue); |
- VariantClear(&vtvalue); |
- } |
- } |
- |
- // In place activate it if it is able to. |
- if (inplace_object_ != NULL) { |
- hr = DoVerb(OLEIVERB_INPLACEACTIVATE); |
- if (FAILED(hr)) |
- return hr; |
- } |
- |
- return S_OK; |
-} |
- |
-HRESULT WebActiveXSite::DoVerb(long verb) { |
- if (ole_object_ != NULL) { |
- HRESULT hr = ole_object_->DoVerb(verb, NULL, |
- static_cast<IOleClientSite*>(this), 0, |
- container_->container_wnd(), &rect_); |
- if (verb == OLEIVERB_INPLACEACTIVATE && SUCCEEDED(hr)) |
- inplace_activated_ = true; |
- return hr; |
- } else { |
- return E_UNEXPECTED; |
- } |
-} |
- |
-HRESULT WebActiveXSite::SetExtent(int width, int height) { |
- if (ole_object_ != NULL) { |
- SIZEL size; |
- if (width < 0) |
- width = 0; |
- if (height < 0) |
- height = 0; |
- ScreenToHimetric(width, height, &size); |
- return ole_object_->SetExtent(DVASPECT_CONTENT, &size); |
- } else { |
- return E_UNEXPECTED; |
- } |
-} |
- |
-void WebActiveXSite::SetRect(const RECT* rect) { |
- if (EqualRect(&rect_, rect)) |
- return; |
- SetExtent(rect->right - rect->left, rect->bottom - rect->top); |
- if (inplace_object_ != NULL) { |
- inplace_object_->SetObjectRects(rect, rect); |
- rect_ = *rect; |
- } |
-} |
- |
-// IUnknown |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::QueryInterface(REFIID iid, |
- void** object) { |
- *object = NULL; |
- if (iid == IID_IUnknown) { |
- // Avoid ambiguous resolution of IUnknown. |
- *object = static_cast<IUnknown*>(static_cast<MinimumIDispatchImpl*>(this)); |
- } else if (iid == IID_IDispatch) { |
- *object = static_cast<MinimumIDispatchImpl*>(this); |
- } else if (iid == IID_IOleClientSite) { |
- *object = static_cast<IOleClientSite*>(this); |
- } else if (iid == IID_IOleControlSite) { |
- *object = static_cast<IOleControlSite*>(this); |
- } else if (iid == IID_IOleInPlaceSite) { |
- *object = static_cast<IOleInPlaceSite*>(this); |
- } else if (iid == IID_IOleInPlaceSiteEx) { |
- *object = static_cast<IOleInPlaceSiteEx*>(this); |
- } else if (iid == IID_IOleInPlaceSiteWindowless) { |
- if (container_->plugin()->windowless()) |
- *object = static_cast<IOleInPlaceSiteWindowless*>(this); |
- } else if (iid == IID_IServiceProvider) { |
- *object = static_cast<IServiceProvider*>(this); |
- } else if (iid == IID_IPropertyBag) { |
- *object = static_cast<IPropertyBag*>(this); |
- } else if (iid == IID_IPropertyBag2) { |
- *object = static_cast<IPropertyBag2*>(this); |
- } |
- TRACK_QUERY_INTERFACE(iid, *object != NULL); |
- return (*object != NULL) ? S_OK : E_NOINTERFACE; |
-} |
- |
-// IOleClientSite |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::SaveObject() { |
- // Do not support saving object to persistent storage. |
- return E_NOTIMPL; |
-} |
- |
-// Even though Flash will call this method to get the url, it will not use |
-// the url to resolve its movie path. |
-// However, according to http://support.microsoft.com/kb/181678, this is |
-// a valid way of getting url from ActiveX control. |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetMoniker( |
- DWORD assign, |
- DWORD which_moniker, |
- IMoniker** moniker) { |
- TRACK_METHOD(); |
- if (which_moniker == OLEWHICHMK_CONTAINER) { |
- std::wstring url = container_->plugin()->GetCurrentURL(); |
- HRESULT hr = CreateURLMoniker(NULL, url.c_str(), moniker); |
- return hr; |
- } else { |
- return E_FAIL; |
- } |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetContainer( |
- IOleContainer** container) { |
- *container = container_; |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::ShowObject() { |
- TRACK_METHOD(); |
- // The control asks us to show the object which we already did. |
- return S_OK; |
-}; |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnShowWindow(BOOL show) { |
- TRACK_METHOD(); |
- // Doesn't apply to us. |
- return S_OK; |
-}; |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::RequestNewObjectLayout() { |
- TRACK_METHOD(); |
- // As MSDN says: "Currently, there is no standard mechanism by which |
- // a container can negotiate how much room an object would like. When |
- // such a negotiation is defined, responding to this method will be |
- // optional for containers." |
- return E_NOTIMPL; |
-} |
- |
-// IOleControlSite |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnControlInfoChanged() { |
- TRACK_METHOD(); |
- // As we do not support mnemonics, we do not need to retrieve control info. |
- // This may change in the future though. |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::LockInPlaceActive(BOOL lock) { |
- TRACK_METHOD(); |
- // We don't support this. |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetExtendedControl(IDispatch** disp) { |
- TRACK_METHOD(); |
- // We do not support extended control. |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::TransformCoords(POINTL* ptl_himetric, |
- POINTF* ptf_container, |
- DWORD flags) { |
- TRACK_METHOD(); |
- // TODO(ruijiang): so far haven't found anyone use this yet. Be aware and |
- // add support if needed. |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::TranslateAccelerator( |
- MSG* msg, |
- DWORD modifiers) { |
- TRACK_METHOD(); |
- // It would be nice if controls call this and let me process accelerator |
- // first. But unfortunately all of them I tested don't. So let's ignore |
- // and just keep an eye on it. |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnFocus(BOOL got_focus) { |
- TRACK_METHOD(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::ShowPropertyFrame() { |
- TRACK_METHOD(); |
- // No we don't want to show property sheet. |
- return E_NOTIMPL; |
-} |
- |
-// IOleWindow |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetWindow(HWND* wnd) { |
- *wnd = container_->container_wnd(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::ContextSensitiveHelp( |
- BOOL enter_mode) { |
- // Do not support this. |
- return E_NOTIMPL; |
-} |
- |
-// IOleInPlaceSite |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::CanInPlaceActivate() { |
- TRACK_METHOD(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnInPlaceActivate() { |
- TRACK_METHOD(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnInPlaceDeactivate() { |
- TRACK_METHOD(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnUIActivate() { |
- TRACK_METHOD(); |
- // If we have multiple sites in a container we may deactivate the previous |
- // active control. This is not a requirement though. |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnUIDeactivate(BOOL undoable) { |
- TRACK_METHOD(); |
- // Some controls will call this when they lose focus. Right now we don't need |
- // to do anything about it. |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetWindowContext( |
- IOleInPlaceFrame** frame, |
- IOleInPlaceUIWindow** doc, |
- LPRECT pos, |
- LPRECT clip, |
- LPOLEINPLACEFRAMEINFO frame_info) { |
- TRACK_METHOD(); |
- if (frame) { |
- *frame = container_; |
- } |
- if (doc) |
- *doc = NULL; |
- if (pos) |
- *pos = rect_; |
- if (clip) |
- *clip = rect_; |
- if (frame_info) { |
- frame_info->fMDIApp = FALSE; |
- frame_info->hwndFrame = container_->container_wnd(); |
- frame_info->haccel = NULL; |
- frame_info->cAccelEntries = 0; |
- } |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::Scroll(SIZE scroll_extant) { |
- TRACK_METHOD(); |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::DiscardUndoState() { |
- TRACK_METHOD(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::DeactivateAndUndo() { |
- TRACK_METHOD(); |
- // Just let the object know that it's deactivated. |
- if (inplace_object_ != NULL) |
- inplace_object_->UIDeactivate(); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnPosRectChange(LPCRECT pos) { |
- TRACK_METHOD(); |
- // We do not let the control move/resize itself. It should be controled |
- // by the container/browser. |
- return E_UNEXPECTED; |
-} |
- |
-// IOleInPlaceSiteEx |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnInPlaceActivateEx( |
- BOOL* no_redraw, |
- DWORD flags) { |
- TRACK_METHOD(); |
- // Redraw doesn't hurt. |
- if (no_redraw) |
- *no_redraw = FALSE; |
- if (flags & ACTIVATE_WINDOWLESS) { |
- // TODO(ruijiang): At this point we know for sure the object is activated |
- // as windowless. Revisit when we implement windowless controls. |
- } |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnInPlaceDeactivateEx( |
- BOOL no_redraw) { |
- TRACK_METHOD(); |
- // See also: OnInPlaceDeactivate |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::RequestUIActivate() { |
- TRACK_METHOD(); |
- return S_OK; |
-} |
- |
-// IOleInPlaceSiteWindowless |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::CanWindowlessActivate() { |
- TRACK_METHOD(); |
- // Yes, we prefer windowless activation. |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetCapture() { |
- TRACK_METHOD(); |
- return has_capture_ ? S_OK : S_FALSE; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::SetCapture(BOOL capture) { |
- TRACK_METHOD(); |
- // TODO(ruijiang): for now, let's cheat the control that it can always get |
- // what it wants (capture). |
- if (capture) { |
- has_capture_ = true; |
- return S_OK; |
- } else { |
- has_capture_ = false; |
- return S_OK; |
- } |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetFocus() { |
- TRACK_METHOD(); |
- // TODO(ruijiang): handle it. |
- return S_FALSE; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::SetFocus(BOOL focus) { |
- TRACK_METHOD(); |
- // TODO(ruijiang): handle it. |
- if (focus) { |
- return S_FALSE; |
- } else { |
- return S_OK; |
- } |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetDC( |
- LPCRECT rect, |
- DWORD flags, |
- HDC* dc) { |
- // It's probably not wise to get the dc of Chrome window and return it, |
- // because we always draw onto a memory dc. Thus we may have to disappoint |
- // the caller. |
- // TODO(ruijiang): We may enable this for other browsers like FireFox. |
- return E_FAIL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::ReleaseDC(HDC dc) { |
- // TODO(ruijiang): We may enable this for other browsers like FireFox. |
- return E_FAIL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::InvalidateRect( |
- LPCRECT rect, |
- BOOL erase) { |
- // This would be the rect (in client coord of the control) that we will |
- // invalidate. |
- RECT rc; |
- // Control's client area, start from top-left corner as 0. |
- RECT client = rect_; |
- OffsetRect(&client, -rect_.left, -rect_.top); |
- if (rect) { |
- RECT rc_in_client = *rect; |
- OffsetRect(&rc_in_client, -rect_.left, -rect_.top); |
- if (!IntersectRect(&rc, &rc_in_client, &client)) |
- return S_OK; |
- } else { |
- rc = client; |
- } |
- // Convert it to NPRect. Now rc is relative to the upper-left corner of |
- // control. This is the requirement of NPN_InvalidateRect. |
- NPRect npr; |
- npr.left = static_cast<uint16>(rc.left); |
- npr.top = static_cast<uint16>(rc.top); |
- npr.right = static_cast<uint16>(rc.right); |
- npr.bottom = static_cast<uint16>(rc.bottom); |
- g_browser->invalidaterect(container_->plugin()->npp(), &npr); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::InvalidateRgn( |
- HRGN rgn, |
- BOOL erase) { |
- TRACK_METHOD(); |
- if (rgn == NULL) { |
- return InvalidateRect(NULL, erase); |
- } else { |
- // TODO(ruijiang): So far no one is using this function yet. So let's just |
- // invalidate the whole area. Optimize this when we need to. |
- return InvalidateRect(NULL, erase); |
- } |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::ScrollRect( |
- INT dx, |
- INT dy, |
- LPCRECT scroll, |
- LPCRECT clip) { |
- TRACK_METHOD(); |
- // TODO(ruijiang): revisit. |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::AdjustRect(LPRECT rc) { |
- TRACK_METHOD(); |
- // TODO(ruijiang): revisit. |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::OnDefWindowMessage( |
- UINT msg, |
- WPARAM wparam, |
- LPARAM lparam, |
- LRESULT* result) { |
- TRACK_METHOD(); |
- // TODO(ruijiang): handle it later. |
- return E_NOTIMPL; |
-} |
- |
-// IServiceProvider |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::QueryService( |
- REFGUID guid, |
- REFIID riid, |
- void** object) { |
- HRESULT hr = E_FAIL; |
- // TODO(ruijiang): We may need to support SID_SWebBrowserApp and |
- // IID_IHTMLWindow2 in the future. |
- if (guid == IID_IBindHost || guid == IID_IWebBrowserApp) |
- hr = container_->QueryInterface(riid, object); |
- TRACK_QUERY_INTERFACE(riid, *object != NULL); |
- return hr; |
-} |
- |
-// IPropertyBag |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::Read(LPCOLESTR prop_name, |
- VARIANT* var, |
- IErrorLog* err_log) { |
- unsigned int i; |
- for (i = 0; i < initial_params_.size(); ++i) { |
- if (_wcsicmp(prop_name, initial_params_[i].name.c_str()) == 0) |
- break; |
- } |
- if (i >= initial_params_.size()) |
- return E_INVALIDARG; |
- if (var->vt == VT_EMPTY || var->vt == VT_BSTR) { |
- // We don't need to do any conversion in this case. |
- var->vt = VT_BSTR; |
- var->bstrVal = ::SysAllocString(initial_params_[i].value.c_str()); |
- return S_OK; |
- } else { |
- // We need to try type conversion. |
- ScopedVariant org; |
- org.vt = VT_BSTR; |
- org.bstrVal = ::SysAllocString(initial_params_[i].value.c_str()); |
- HRESULT hr = VariantChangeType(var, &org, 0, var->vt); |
- return FAILED(hr) ? E_FAIL : S_OK; |
- } |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::Write(LPCOLESTR prop_name, |
- VARIANT* var) { |
- TRACK_METHOD(); |
- return E_NOTIMPL; |
-} |
- |
-// IPropertyBag2 |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::Read(ULONG c_properties, |
- PROPBAG2* prop_bag, |
- IErrorLog* err_log, |
- VARIANT* value, |
- HRESULT* error) { |
- if (!prop_bag) |
- return E_INVALIDARG; |
- for (unsigned int i = 0; i < c_properties; ++i) { |
- PROPBAG2* p = prop_bag + i; |
- value->vt = p->vt; |
- HRESULT hr = Read(p->pstrName, value + i, err_log); |
- if (error) |
- error[i] = hr; |
- } |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::Write(ULONG c_properties, |
- PROPBAG2* prop_bag, |
- VARIANT* value) { |
- TRACK_METHOD(); |
- return E_NOTIMPL; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::CountProperties( |
- ULONG* pc_properties) { |
- if (!pc_properties) |
- return E_INVALIDARG; |
- *pc_properties = static_cast<ULONG>(initial_params_.size()); |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::GetPropertyInfo( |
- ULONG iproperty, |
- ULONG c_properties, |
- PROPBAG2* prop_bag, |
- ULONG* properties_returned) { |
- if (!prop_bag) |
- return E_INVALIDARG; |
- if (iproperty >= initial_params_.size()) |
- return E_INVALIDARG; |
- unsigned int i; |
- for (i = iproperty; |
- i < iproperty + c_properties && i < initial_params_.size(); |
- ++i) { |
- PROPBAG2* p = prop_bag + (i - iproperty); |
- memset(p, 0, sizeof(PROPBAG2)); |
- p->dwType = PROPBAG2_TYPE_DATA; |
- p->vt = VT_BSTR; |
- p->cfType = CF_TEXT; |
- p->dwHint = iproperty; |
- // According to the document of IPropertyBag2::GetPropertyInfo, here |
- // requires a string allocated by CoTaskMemAlloc. |
- p->pstrName = CoTaskMemAllocString(initial_params_[i].name); |
- } |
- if (properties_returned) |
- *properties_returned = i - iproperty; |
- return S_OK; |
-} |
- |
-HRESULT STDMETHODCALLTYPE WebActiveXSite::LoadObject(LPCOLESTR name, |
- DWORD hint, |
- IUnknown* unk_object, |
- IErrorLog* err_log) { |
- TRACK_METHOD(); |
- return E_NOTIMPL; |
-} |
- |
-} // namespace activex_shim |