CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 10 of 10
  1. #1
    Join Date
    Dec 1999
    Posts
    85

    IHTMLWindow2 get_document fails with Access is Denied on IFrame

    get_document fails with Access is denied with IFrame's

    whats the problem ?, i took most of this code from microsoft's site.

    thanks,
    lee.

    I wait for if (dispidMember == DISPID_DOCUMENTCOMPLETE)
    parse the html page ok, look for frames and process those, which usually works but i've found IFrames makes it fall over with Access is Denied.

    VARIANT frameRequested;
    VARIANT frameOut;
    IHTMLFramesCollection2* pFramesCol = NULL;
    IHTMLWindow2* pRightFrameWindow = NULL;
    IHTMLDocument2* pRightDoc = NULL;

    frameRequested.vt = VT_UINT;

    HRESULT hr = spHTML->get_frames(&pFramesCol);
    if (FAILED(hr))
    {
    MessageBox(NULL,_T("no frames"),NULL,NULL);
    return FALSE;
    }

    long len = 0;
    pFramesCol->get_length(&len);
    if(len==0) return FALSE;

    for(int f=0;f<len;f++)
    {
    MessageBox(NULL,CComBSTR(frames[f]),NULL,NULL);

    frameRequested.lVal = f;

    hr = pFramesCol->item(&frameRequested, &frameOut);
    if (SUCCEEDED(hr)) // frame present
    {

    hr = frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pRightFrameWindow);
    if (SUCCEEDED(hr)) // QueryInterface OK
    {


    hr = pRightFrameWindow->get_document(&pRightDoc);
    if (!SUCCEEDED(hr))
    {
    _com_error e( hr );
    MessageBox(NULL, CComBSTR(e.ErrorMessage()),NULL,NULL );
    }



  2. #2
    Join Date
    Nov 2001
    Location
    Portugal
    Posts
    5

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    Hi,
    You can't get from a "normal" Frame acess to the Document of a IFRAME, also if you try you will see that when you receive the DocumentComplete from a IFRAME you also can't get the Document from the Parent window, or Top Window.
    This behaviour is if I'm not mistaken if the Domain differs and it's not a bug.


  3. #3
    Join Date
    Dec 1999
    Posts
    85

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    thanks for that, I have partially got around that problem by using IHTMLFrameBase instead which works fine with IFrames in the html document root.

    but I don't know how to implement it within a Frame.. i'm really stuck!
    any ideas anybody ? some code would be a god send.

    thanks,
    lee.


  4. #4
    Join Date
    Nov 2001
    Location
    Portugal
    Posts
    5

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    Hi,
    The IHTMLFrameBase doesn't give acess to the Document, how did you managed to get it from there ???

    If you want to get the document from a frame, the
    get_document of the IHTMLWindow2 seems to work fine.

    So you only need to query each Frame Item for a IHTMLWindow2 and then use the get_document if
    the returned IHTMLDocument2 isn't null then you are probably dealing with a frame.
    Once you have the frame you can Query it for a
    IOleWindow and then get the window Handle.

    If you managed to get the document of a IFRAME from another Frame, please let me know.

    thanks,


  5. #5
    Join Date
    Dec 1999
    Posts
    85

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    ok will look into that... thanks.

    heres the IID_IHTMLFrameBase code which works with javascript IFrames in the document root, it took a while to work it out. shame there isn't more examples on microsofts IE site!, you know of any other sites ???

    have fun.


    BOOL CViewSource::RetrieveIFrames()
    {
    HRESULT hr;

    IHTMLFramesCollection2* pFramesCol = NULL;

    hr = spHTML->get_frames(&pFramesCol);

    IHTMLElementCollection* pColl = NULL;
    if(SUCCEEDED(hr = spHTML->get_all( &pColl )))
    {
    long length = 0;
    if(SUCCEEDED(hr = pColl->get_length(&length)) && (length))
    {
    for (int x = 0; x < length; x++ )
    {
    VARIANT Index;
    IDispatch* pDisp2 = NULL;
    Index.vt = VT_UINT;
    Index.lVal = x;
    VARIANT var2;
    VariantInit( &var2 );
    if(SUCCEEDED(hr = pColl->item (Index, var2, &pDisp2)))
    {

    IHTMLFrameBase* pBase = NULL;

    if(SUCCEEDED(hr = pDisp2->QueryInterface(IID_IHTMLFrameBase,(void**)&pBase)) && (pBase))
    {
    BSTR src = NULL;
    if(SUCCEEDED(pBase->get_src(&src)))
    {
    // do whatever you want

    }

    }

    }

    }
    }

    }

    return S_OK;
    }


  6. #6
    Join Date
    Nov 2001
    Location
    Portugal
    Posts
    5

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    The code you posted doesn't give acess to the "document", what I needed was a way to get the IHTMLDocument of a "IFRAME" in a IHTMLFramesCollection. But thanks anyway, if you need the code to get the IHTMLDocument of a "FRAME" let me know...

    Unfortunately code examples for the HTML Interfaces are rare... so the best way to get info are the Newsgroups.

    Thanks,


  7. #7
    Join Date
    Dec 1999
    Posts
    85

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    yes please.

    any code is usefull.

    thanks,
    lee.


  8. #8
    Join Date
    Nov 2001
    Location
    Portugal
    Posts
    5

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    hr = pHTMLDoc->get_frames(&pFrameCol);
    if(SUCCEEDED(hr) && pFrameCol)
    {
    long lNumberOfFrames = 0;
    pFrameCol->get_length(&lNumberOfFrames);
    VARIANT varObject;
    VARIANT varTmp;
    varTmp.vt = VT_INT;
    for(long i=0; i<lNumberOfFrames; i++)
    {
    varTmp.intVal = i;
    pFrameCol->item(&varTmp, &varObject);
    if(varObject.pdispVal)
    {
    // Get this Window
    hr = varObject.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**) &pHTMLWindow2Aux);

    if(SUCCEEDED(hr) && pHTMLWindow2Aux)
    {
    hr = pHTMLWindow2Aux->get_document(&pHTMLDocAux);
    if(SUCCEEDED(hr))
    {
    if(pHTMLDocAux) // Possible Frame
    {
    // At this point you have a valid IHTMLDocument
    // To get the HANDLE of the Frame Window
    hr = pHTMLDocAux->QueryInterface(IID_IOleWindow,(void**)&pOleWindowAux);
    if(SUCCEEDED(hr) && pOleWindowAux)
    {
    HWND hwndTmp = NULL;
    hr = pOleWindowAux->GetWindow(&hwndTmp);
    }




    **********
    By the way if you haven't notices if a page has a META TAG of Refresh but doesn't give a diferent URL you don't receive the DocumentComplete Notification, do you know a way to identify if the page was refreshed ?


  9. #9
    Join Date
    Nov 2001
    Location
    Portugal
    Posts
    5

    Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    I forgot to ask if you know how to detect if a page was readed or not from the cache...


  10. #10
    Join Date
    Feb 2010
    Posts
    1

    Talking Re: IHTMLWindow2 get_document fails with Access is Denied on IFrame

    Quote Originally Posted by AWarlock View Post
    The code you posted doesn't give acess to the "document", what I needed was a way to get the IHTMLDocument of a "IFRAME" in a IHTMLFramesCollection. But thanks anyway, if you need the code to get the IHTMLDocument of a "FRAME" let me know...

    Unfortunately code examples for the HTML Interfaces are rare... so the best way to get info are the Newsgroups.

    Thanks,
    now ok:

    CComPtr < IHTMLDocument2 > spDoc2;
    hr = spWin2->get_document( &spDoc2 ); //error in here!!!!
    if (!SUCCEEDED(hr))
    {
    _com_error e( hr ); Display("get document error:"+CString(e.ErrorMessage()));
    spDoc2=HtmlWindowToHtmlDocument(spWin2);//ok now!!!!
    }




    // Converts a IHTMLWindow2 object to a IWebBrowser2. Returns NULL in case of failure.
    CComQIPtr<IWebBrowser2> HtmlWindowToHtmlWebBrowser(CComQIPtr<IHTMLWindow2> spWindow)
    {
    ATLASSERT(spWindow != NULL);

    CComQIPtr<IServiceProvider> spServiceProvider = spWindow;
    if (spServiceProvider == NULL)
    {
    return CComQIPtr<IWebBrowser2>();
    }

    CComQIPtr<IWebBrowser2> spWebBrws;
    HRESULT hRes = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&spWebBrws);
    if (hRes != S_OK)
    {
    return CComQIPtr<IWebBrowser2>();
    }

    return spWebBrws;
    }


    CComQIPtr<IHTMLDocument2> HtmlWindowToHtmlDocument(CComQIPtr<IHTMLWindow2> spWindow)
    {
    ATLASSERT(spWindow != NULL);

    CComQIPtr<IHTMLDocument2> spDocument;
    HRESULT hRes = spWindow->get_document(&spDocument);

    if ((S_OK == hRes) && (spDocument != NULL))
    {
    // The html document was properly retrieved.
    return spDocument;
    }

    // hRes could be E_ACCESSDENIED that means a security restriction that
    // prevents scripting across frames that loads documents from different internet domains.
    CComQIPtr<IWebBrowser2> spBrws = HtmlWindowToHtmlWebBrowser(spWindow);
    if (spBrws == NULL)
    {
    return CComQIPtr<IHTMLDocument2>();
    }

    // Get the document object from the IWebBrowser2 object.
    CComQIPtr<IDispatch> spDisp;
    hRes = spBrws->get_Document(&spDisp);
    spDocument = spDisp;

    return spDocument;
    }

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured