J'ai écrit un objet d'aide de navigateur pour obtenir le texte entre les balises et l'utiliser à des fins d'exploration de données. J'ai essayé de l'utiliser sur igoogle
(essentiellement pour tester sa capacité sur les gadgets) et il a échoué dans certains des cas où un est présent avec une source externe.Comment accéder au corps <iframe> en utilisant C++/ATL/COM?
Je peux obtenir le <div>
et son enfant mais ne parviennent pas à obtenir le corps.
je reçois la collection d'images de cette API HRESULT IHTMLDocument2::get_frames(IHTMLFramesCollection2 **p);
Le problème peut être recréé dans igoogle et Firefox en utilisant le gadget loan calculator
. Vous aurez également besoin de l'extension fire bug pour déboguer la page. Pour des fins de référence, je suis coller l'échantillon ici ...
<div class="modboxin" id="m_8_b"><div style="border: 0pt none; padding: 0pt; margin: 0pt; width: 100%;" id="remote_8">
<iframe scrolling="no" frameborder="0" onload="_ifr_ol(this)" style="border: 0pt none; padding: 0pt; margin: 0pt; width: 100%; height: 100px; overflow: hidden;" name="remote_iframe_8" id="remote_iframe_8" src="http://8.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&v=682f3db70d7cfff515d7c64fd24923&container=ig&view=default&debug=0&mid=8&lang=en&url=http%3A%2F%2Fwww.nova.edu%2F%7Ewillheat%2Floan.xml&country=US&parent=http://www.google.com&libs=core:core.io:core.iglegacy:auth-refresh&synd=ig&view=default#st=...B27zWVKsnJu6OviCNnzXoPjkDsbPg95yZNMwfmMaLnwWoRxGaRArxTpOqK4TiH87uGUiHnYkkaqU9NE1sOyms6sg/Jwi&gadgetId=116809661812082345195&gadgetOwner=105250506097979753968&gadgetViewer=105250506097979753968&rpctoken=422312139&ifpctok=422312139">
</iframe>
</div>
Le lien est pas complet comme je l'ai remplacé une partie du src
avec ...
. Maintenant que vous pouvez voir qu'il n'y a pas de corps pour le bien qu'il soit rendu dans le navigateur ..
Comme par cet article (http://stackoverflow.com/questions/957133/does-body-onload-wait-for-iframes
) l'événement onload n'attend pas que les trames se terminent.
Je peux conclure que je dois utiliser une sorte onload
écouteur pour l' ... mais je ne suis pas sûr de savoir comment ...
suggèrent Veuillez un moyen/extrait pour récupérer le corps du en utilisant ATL/API COM ...
** Mise à jour **
J'utilise le code suivant pour obtenir le <iframes>
. Bien que j'obtienne la collection iframe mais quand j'essaie d'obtenir leur corps il échoue ... peut-être parce qu'ils ne sont pas chargés à ce moment-là?!
void testFrame(IHTMLDocument2* pDocument)
{
CComQIPtr<IHTMLFramesCollection2> col;
HRESULT hr = pDocument->get_frames(&col);
if((hr == S_OK) && (col != NULL))
{
long counter = 0;
hr = col->get_length(&counter);
if((hr == S_OK) && (counter > 0))
{
for (int i = 0; i < counter; i++)
{
VARIANT v1, v2;
v1.vt = VT_I4; v1.lVal = i;
VariantClear (&v2);
hr = col->item(&v1, &v2);
if (hr == S_OK && (v2.vt == VT_DISPATCH))
{
CComPtr<IDispatch> pDispatch = v2.pdispVal;
CComQIPtr<IHTMLWindow2, &IID_IHTMLWindow2> pFrame = pDispatch;
if(pFrame)
{
CComPtr<IHTMLDocument2> spHTML;
hr = pFrame->get_document (&spHTML);
if((hr == S_OK) && (spHTML != NULL))
{
CComQIPtr<IHTMLElement> elem;
hr = spHTML->get_body(&elem);
if((hr == S_OK) && (elem != NULL))
{
CComBSTR str;
hr = elem->get_innerHTML(&str);
if((hr == S_OK) && (str != NULL))
{
box(str);
}else if(hr != S_OK) {
box(_T("hr is not ok"));
}else if(str == NULL){
box(_T("STR is null"));
}else
box(_T("Failed"));
}
}
}
}
}
}
}
}
Et,
Toute suggestion, comment obtenir le corps iframe .... par la façon dont je traitais cela en OnDocumentComplete
événement ...
Merci,
Je suis désolé - quelle est votre question exactement? –
Salut Changeling, j'essaie d'obtenir le corps du