功能就是在webbrowser里面點一下登錄按鈕。在遍歷元素的里面獲取元素text, get_innerText() 就崩潰。
首先這在主線是可以的,寫在執行緒里面就不行了。我已經在執行緒開頭加了 CoInitializeEx(0, COINIT_APARTMENTTHREADED);
具體的代碼:
//遍歷webbrowser的元素 取出符合條件的元素
IHTMLElement* getElementByName(CComQIPtr<IHTMLDocument3>&pDoc3, LPCSTR tagName, LPCSTR name)
{
CComQIPtr<IHTMLElementCollection> pelColl;
HRESULT hr = pDoc3->getElementsByTagName((_bstr_t)tagName, &pelColl);
if (FAILED(hr) || pelColl == NULL)
{
return NULL;
}
long len = 0;
pelColl->get_length(&len);
for (long i = 0; i < len; i++)
{
_variant_t index = i;
IDispatch *pdisp = NULL;
pelColl->item(index, index, &pdisp);
if (pdisp == NULL)
{
continue;
}
IHTMLElement* pele = NULL;
pdisp->QueryInterface(IID_IHTMLElement, (LPVOID*)(&pele));
if (pele)
{
BSTR b;
//這里崩潰,&b的值是0xCCCCCCCC
pele->get_innerText(&b);
_bstr_t bstr = b;
if (bstr.length() && strcmp(bstr, name) == 0)
{
return pele;
}
pele->Release();
}
pdisp->Release();
}
return NULL;
}
//執行緒函式
DWORD __stdcall threadLoginbd(LPVOID lp)
{
HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
if (FAILED(hr))
{
TRACE("1");
}
CwebbrowserDlg* pDlg = (CwebbrowserDlg*)lp;
CExplorer1* pIe = &(pDlg->m_ie);
CComQIPtr<IHTMLDocument3>pDoc3 = pIe->get_Document();
//獲取元素 然后點擊
IHTMLElement* pele = getElementByName(pDoc3, "a", "登錄");
if (pele)
{
pele->click();
pele->Release();
TRACE("3");
}
CoUninitialize();
return 0;
}
搞不懂定義了一個BSTR b,取的地址怎么會是0xCCCCCCCC。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/232185.html
