C++ 使用c+控制现有的Internet Explorer+;

C++ 使用c+控制现有的Internet Explorer+;,c++,internet-explorer,com,C++,Internet Explorer,Com,用例:有人让我自动化他的internet explorer。每天,他都必须导航到相同的URL,输入相同的凭据并登录。他希望计算机能够自动做到这一点:通过一个应用程序,可以导航到URL,输入帖子数据并自动登录。然后,他可以继续手动浏览页面 这样,如果我想直接控制一个现有的Internet Explorer实例,那么我怎么用C++ +来研究?经过几个小时的研究,我设法打开了一个新的IE实例,并导航到一个特定的URL。 我采取的步骤: 在项目选项中链接以下库:libole32.a、liboleaut3

用例:有人让我自动化他的internet explorer。每天,他都必须导航到相同的URL,输入相同的凭据并登录。他希望计算机能够自动做到这一点:通过一个应用程序,可以导航到URL,输入帖子数据并自动登录。然后,他可以继续手动浏览页面


这样,如果我想直接控制一个现有的Internet Explorer实例,那么我怎么用C++ +

来研究?经过几个小时的研究,我设法打开了一个新的IE实例,并导航到一个特定的URL。 我采取的步骤:

  • 在项目选项中链接以下库:libole32.a、liboleaut32.a、liboleacc.a、libuuid.a

  • 在主cpp文件的开头包括cassert和exdisp.h

  • 在主cpp文件中插入以下代码:

  • 
    内部主(空){

    HRESULT-hret;
    hret=协同初始化(NULL);
    断言(成功(hret));
    CLSID CLSID;//获取IE CLSID
    hret=CLSIDFromProgID(L“InternetExplorer.Application”&clsid);
    断言(成功(hret));
    IUnknown*p;//获取IUnknown接口
    hret=CoCreateInstance(clsid、NULL、CLSCTX_ALL、IID_IUnknown、reinterpret_cast(&p));
    断言(成功(hret));
    IDispatch*q;//从IUnknown获取IDispatch接口
    hret=p->QueryInterface(IID_IDispatch,reinterpret_cast(&q));
    断言(成功(hret));
    IWebBrowser2*r;//从IDispatch获取IWebBrowser2接口
    hret=q->查询接口(IID_IWebBrowser2,重新解释(&r));
    断言(成功(hret));
    IUnknown*s;//从IWebBrowser2获取IUnknown
    hret=r->QueryInterface(IID\u IUnknown,重新解释类型(&s));
    断言(成功(hret));
    /////传递的//////////////////////////
    断言(p==s);
    ////////////////////////////////////////
    变异狂暴;
    Variatinit(&vEmpty);
    变异vFlags;
    V_VT(&vFlags)=VT_I4;
    V_I4(&vFlags)=导航开放新窗口;
    BSTR bstrURL=SysAllocString(L)http://www.google.com");
    r->导航(bstrURL,&vFlags,&vEmpty,&vEmpty,&vEmpty);
    r->Quit();
    SysFreeString(bstrURL);
    p->Release();q->Release();r->Release();s->Release();
    coninitialize();返回0;
    }
    

    我没有一个经过测试的答案,但这个问题的答案可以给我一个方向:去哪里寻找和研究:(几乎)现代计算机的一切都是“可能的”,问题是:为什么要做这样的事情?如果您想构建一个单独的应用程序,那么为什么不包含下载您正在寻找的页面的代码呢?但是这样的应用已经存在了。。。(搜索
    wget
    )。你能澄清一下这个用例吗?从可用性的角度来看,你不应该强占现有的InternetExplorer实例。(如果用户有未保存的电子邮件怎么办?)您应该创建自己的实例并使用它
    IWebBrowser2
    为您提供了操作IE窗口的方法。我刚刚更新了我的帖子,以澄清用例。
    
    int main(void) {

    HRESULT hret;
    hret=CoInitialize(NULL); 
    assert(SUCCEEDED(hret));
    
    CLSID clsid;            // Get IE CLSID
    hret=CLSIDFromProgID(L"InternetExplorer.Application",&clsid);
    assert(SUCCEEDED(hret));
    
    IUnknown *p;            // Get IUnknown Interface
    hret=CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IUnknown,reinterpret_cast<void**>(&p));
    assert(SUCCEEDED(hret));
    
    IDispatch *q;           // Get IDispatch Interface from IUnknown
    hret=p->QueryInterface(IID_IDispatch,reinterpret_cast<void**>(&q));
    assert(SUCCEEDED(hret));
    
    IWebBrowser2 *r;        // Get IWebBrowser2 Interface from IDispatch
    hret=q->QueryInterface(IID_IWebBrowser2,reinterpret_cast<void**>(&r));
    assert(SUCCEEDED(hret));
    
    IUnknown *s;            // Get IUnknown from IWebBrowser2
    hret=r->QueryInterface(IID_IUnknown,reinterpret_cast<void**>(&s));
    assert(SUCCEEDED(hret));
    
    ///// Transitive //////////////////////////
    assert(p==s);
    ////////////////////////////////////////
    
    VARIANT vEmpty;
    VariantInit(&vEmpty);
    VARIANT vFlags;
    V_VT(&vFlags) = VT_I4;
    V_I4(&vFlags) = navOpenInNewWindow;
    
    
    BSTR bstrURL = SysAllocString(L"http://www.google.com");
    
    r->Navigate(bstrURL, &vFlags, &vEmpty, &vEmpty, &vEmpty);
    r->Quit();
    
    SysFreeString(bstrURL);
    
    p->Release();  q->Release();  r->Release(); s->Release();  
    
    CoUninitialize(); return 0;
    
    }