2 zhangdeyunahut zhangdeyunahut 于 2016.03.01 21:22 提问

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(),其余函数都没变

3个回答

devmiao
devmiao   Ds   Rxr 2016.03.01 21:41
zhangdeyunahut
zhangdeyunahut 谢谢啊!博客我看了,但还是没发现我的问题 出在哪。
接近 2 年之前 回复
oyljerry
oyljerry   Ds   Rxr 2016.03.01 23:39

先看有没有正确拿到浏览器句柄等 这样才能跳转API调用

zhangdeyunahut
zhangdeyunahut 浏览器句柄拿到了,但是还是无法实现跳转
接近 2 年之前 回复
zhangdeyunahut
zhangdeyunahut   2016.03.02 18:16

问题已解决,还是自己水平太菜了!!!代码更改为如下,顺利通过
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();

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!