Notice: This website is an unofficial Microsoft Knowledge Base (hereinafter KB) archive and is intended to provide a reliable access to deleted content from Microsoft KB. All KB articles are owned by Microsoft Corporation. Read full disclaimer for more details.

How To Access Methods/Properties of Container From Script


View products that this article applies to.

Summary

When hosting the WebBrowser control in a Visual C++ application, it may be necessary to access methods or properties of the container from script on a Web page. This article describes how to do this by implementing the IDocHostUIHandler interface.

↑ Back to the top


More information

By implementing the IDocHostUIHandler interface, you can control many of the User Interface features of the WebBrowser control in your hosting application. IDocHostUIHandler also allows you to extend the Dynamic HTML (DHTML) Object Model to access methods and properties of the container from within script.

The GetExternal() method of IDocHostUIHandler provides this functionality. When script on a Web page calls "window.external.yourMethod," the WebBrowser control calls your GetExternal method to retrieve a pointer to the IDispatch of your hosting application. It is through this pointer that the WebBrowser control is able to access your methods and properties.

Once the WebBrowser control has a pointer to the IDispatch of the container, it then calls IDispatch::GetIDsOfNames() to get the DISPID of the method or property called from script, yourMethod in this case.

Finally, the WebBrowser control calls IDispatch::Invoke() with the DISPID retrieved from GetIDsOfNames().

Here are the steps you must follow to extend the DHTML Object Model to be able to access the container's methods and properties from script:
  1. Implement IDocHostUIHandler.
  2. Implement the IDocHostUIHandler::GetExternal method. Set the IDispatch parameter to that of your container like so:
    STDMETHOD(GetExternal)(IDispatch** ppDispatch)
    {
       // Assumes you inherit from IDispatch
       *ppDispatch = (IDispatch*)this;
       (*ppDispatch)->AddRef();
    
       return S_OK;
    }
    					
  3. Return the dispatch ID (DISPID) of your method or property from GetIDsOfNames. If you added your method or property using a wizard, this will be done for you.
  4. Implement the DISPID of your method or property in your implementation of IDispatch::Invoke like so:
    STDMETHODIMP CAtlBrCon::Invoke(DISPID dispidMember, REFIID riid,
                                   LCID lcid, WORD wFlags,
                                   DISPPARAMS* pDispParams,
                                   VARIANT* pvarResult,
                                   EXCEPINFO* pExcepInfo, UINT* puArgErr)
    {
       switch (dispidMember)
       {
          case DISPID_MYMETHOD_OR_PROPERTY:
             // Do something here
    
          default:
             return E_INVALIDARG;
       }
    
       return S_OK;
    }
    					
  5. Call a method or property of the container from script like this:
     <SCRIPT LANGUAGE="VBScript">
        Sub SomeControl_OnClick
           window.external.yourMethod
        End Sub
     </SCRIPT>
    					

↑ Back to the top


References

For more information about the technologies discussed in this article, please refer to the documentation regarding Advanced Hosting Interfaces and IDocHostUIHandler in the following MSDN web site: (c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Scott Roberts, Microsoft Corporation

↑ Back to the top


Properties

Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

↑ Back to the top


Keywords: KB188015, kbwebbrowser, kbscript, kbhowto, kbFAQ

↑ Back to the top

Article Info
Article ID : 188015
Revision : 3
Created on : 7/20/2012
Published on : 7/20/2012
Exists online : False
Views : 371