2017-08-08 77 views
0

我试图填补从C++程序的Internet Explorer某种形式的输入字段,但我面对的随机错误,我希望是因为我的代码:的getElementsByTagName与IHTMLDocument3随机返回任何

UINT msg = RegisterWindowMessage("WM_HTML_GETOBJECT"); 
LRESULT result = 0; 
SendMessageTimeout(hwnd, msg, NULL, NULL, SMTO_ABORTIFHUNG, 10000, (PDWORD_PTR)&result); 
if (!result) 
    return; 


// get main document object 
IHTMLDocument3 *doc = NULL; 
ObjectFromLresult(result, IID_IHTMLDocument3, NULL, (void**)&doc); 
if (!doc) 
    return; 

VARIANT varint, varstr; 
varint.vt = VT_I4; 
varstr.vt = VT_BSTR; 


IHTMLElementCollection* pElemCollections=NULL; 


if (FAILED(doc->getElementsByTagName(L"input", &pElemCollections))) 
    return; 

long nelm; 
pElemCollections->get_length(&nelm); 

... 

在最后一行,并且在同一页面上具有相同的HWND,我有时会得到好的数字或输入字段,并且对于nelm通常会得到0。

你在我的代码中看到错误,或者它是一个错误? 请注意,我验证了HWND是正确的,并且return从不被调用。

感谢

+0

什么的IHTMLDocument2 :: get_readyState的结果,当这种情况发生? –

+0

get_readyState返回“完整”,我可以没有问题地获得IHTMLDocument2 :: get_body。有时候,如果我得到nelm = 0并返回调试器将输入更改为INPUT并再次运行该行,它可以工作,但它也是随机的。 – Entretoize

+0

与该代码我可以得到它的工作(对于A标签):'BSTR标记= L“A”; \t long nelm; \t int n = 0; \t do \t {\t \t n ++; \t \t if(tag == L“a”)\t \t \t tag = L“A”; \t \t else \t \t \t tag = L“a”; \t \t if(pElemCollections)\t \t \t pElemCollections-> Release(); if(FAILED(doc> getElementsByTagName(tag,&pElemCollections)))return; \t \t \t \t pElemCollections-> get_length(&nelm); \t}而(nelm == 0);' – Entretoize

回答

0

我必须这样做没有更多的问题:

UINT msg = RegisterWindowMessage("WM_HTML_GETOBJECT"); 
LRESULT result = 0; 
SendMessageTimeout(hwnd, msg, NULL, NULL, SMTO_ABORTIFHUNG, 10000, (PDWORD_PTR)&result); 
if (!result) 
    return; 


// get main document object 
IHTMLDocument3 *doc = NULL; 
ObjectFromLresult(result, IID_IHTMLDocument3, NULL, (void**)&doc); 
if (!doc) 
    return; 

CComVariant varint; 
CComVariant varstr; 


IHTMLElementCollection* pElemCollections=NULL; 

CComBSTR name(L"input") 
if (FAILED(doc->getElementsByTagName(name, &pElemCollections))) 
    return; 

long nelm; 
pElemCollections->get_length(&nelm); 

...