问题描述
- C++ Navigate2()怎么不能跳转到指定的网址
-
void EnumIE(void){
::CoInitialize(NULL);//初始化com库
CComPtr spShellWin;HRESULT hr=spShellWin.CoCreateInstance(CLSID_ShellWindows);
if (FAILED(hr))
{
return;
}
long nCount=0; //取得浏览器实例个数(Explorer和IExplorer)
spShellWin->get_Count(&nCount);
if (0==nCount)
{
return;
}
for(int i=0; i
{
CComPtr spDispIE;hr=spShellWin->Item(CComVariant((long)i), &spDispIE);
if (FAILED(hr)) continue;
CComQIPtr<IWebBrowser2>spBrowser=spDispIE; //注意是IE浏览器 if (!spBrowser) continue; spBrowser->put_Visible(true); //Commentout this line if you dont want the browser to be displayed //Modify by jncao 2007-09-17 //******************************************************************************* CString cIEUrl_Filter; //设置的URL(必须是此URL的网站才有效); cIEUrl_Filter="https://w.seu.edu.cn/portal/index.html"; //设置过滤的网址 //******************************************************************************* VARIANT var; var.vt = VT_BSTR; var.bstrVal=CComBSTR(cIEUrl_Filter); hr=spBrowser->Navigate2(&var,NULL,NULL,NULL,NULL) ; //Open the URL page if(FAILED(hr)) { cout<<"Navigete2 Failed!!"<<endl; return; } cout<<"good-1"<<endl; //spBrowser->Navigate2(vaURL,null,null,null,null) ; //Open the URL page CComPtr<IDispatch> spDispDoc; hr=spBrowser->get_Document(&spDispDoc); if (FAILED(hr)) continue; CComQIPtr<IHTMLDocument2> spDocument2 =spDispDoc; if (!spDocument2) continue; EnumForm(spDocument2); //枚举所有的表单 cout<<"good0"<<endl; //******************************************************************************* //CString cIEUrl_Filter; //设置的URL(必须是此URL的网站才有效); //cIEUrl_Filter="https://w.seu.edu.cn/portal/index.html"; //设置过滤的网址 //*******************************************************************************
/* CComBSTR IEUrl;
spBrowser->get_LocationURL(&IEUrl);CString cIEUrl_Get; //从机器上取得的HTTP的完整的URL;
cIEUrl_Get=IEUrl;
cIEUrl_Get=cIEUrl_Get.Left(cIEUrl_Filter.GetLength()); //截取前面N位if (cIEUrl_Get.Compare(cIEUrl_Filter)==0) { // 程序运行到此,已经找到了IHTMLDocument2的接口指针 EnumForm(spDocument2); //枚举所有的表单 } */
}
::CoUninitialize();
}这个是我根据http://blog.csdn.net/fjssharpsword/article/details/6080572这个改写的函数EnumIE(),其余函数都没变
解决方案
http://blog.csdn.net/lee353086/article/details/38359095
解决方案二:
先看有没有正确拿到浏览器句柄等 这样才能跳转API调用
解决方案三:
问题已解决,还是自己水平太菜了!!!代码更改为如下,顺利通过
void EnumIE(void)
{
OleInitialize(NULL);//初始化com库
HRESULT hr;
IWebBrowser2* spBrowser;
VARIANT vPostData;
VariantInit(&vPostData);
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2, (void**)&spBrowser);
if (spBrowser==NULL) return;
spBrowser->put_Visible(VARIANT_TRUE); //Commentout this line if you dont want the browser to be displayed
VARIANT vEmpty;
VariantInit(&vEmpty);
VARIANT var;
var.vt = VT_BSTR;
//var.bstrVal=CComBSTR(cIEUrl_Filter);
var.bstrVal = SysAllocString(L"https://w.seu.edu.cn/portal/index.html");
hr=spBrowser->Navigate2(&var,&vEmpty,&vEmpty,&vEmpty,&vEmpty) ; //Open the URL page
if (SUCCEEDED(hr))
{
spBrowser->put_Visible(VARIANT_TRUE);
}
else
{
spBrowser->Quit();
}
BOOL bReady=0;
BSTR bsStatus;
CString mStr;
while(!bReady) //This while loop maks sure that the page is fully loaded before we go to the next page
{
//如果用户手动关闭IE窗口,退出循环
SHANDLE_PTR hHwnd;
spBrowser->get_HWND(&hHwnd);
if (NULL == hHwnd)
{
bReady=1;
return;
}
//等待网页完全打开,退出循环
spBrowser->get_StatusText(&bsStatus);
mStr=bsStatus;
if(mStr=="完毕" || mStr=="完成" || mStr=="Done" )
{
bReady=1;
}
Sleep(200);
}
CComPtr<IDispatch> spDispDoc;
hr=spBrowser->get_Document(&spDispDoc);
if (FAILED(hr))
{
spBrowser->Release();
OleUninitialize();
return;
}
CComQIPtr<IHTMLDocument2> spDocument2 =spDispDoc;
if (!spDocument2)
{
spBrowser->Release();
OleUninitialize();
return;
}
EnumForm(spDocument2); //枚举所有的表单
spBrowser->Release();
OleUninitialize();
}