2015-01-04 116 views
1

使用案例:有人问我自动化他的Internet Explorer。每天,他必须导航到相同的URL,输入相同的凭证并登录。他希望计算机自动执行此操作:使用导航到URL的应用程序,输入发布数据并自动登录。然后他可以继续通过该页面手动导航。因此,如果我想直接控制一个现有的Internet Explorer实例,我将如何使用C++来做到这一点?用C++控制现有的Internet Explorer

+0

我没有经过测试的答案,但这个答案我的问题可以给的暗示方向在哪里寻找和研究:http://stackoverflow.com/a/8285218/341065 – wilx 2015-01-04 13:18:02

+0

(几乎)现代计算机的一切都是“可能的”,问题是:为什么要做这样的事情?如果你想建立一个单独的应用程序,那么为什么不包含下载你正在寻找的页面的代码呢?但是这样的应用程序已经存在...(搜索'wget')。你能否澄清用例? – kebs 2015-01-04 14:49:26

+0

从可用性的角度来看,您不应该征用现有的Internet Explorer实例。 (如果用户有未保存的电子邮件呢?)你应该创建自己的实例并使用它。 'IWebBrowser2'为您提供了处理IE窗口的方法。 – 2015-01-04 15:13:28

回答

0

经过数小时的研究,我设法打开IE的新实例并导航到特定的URL。

的步骤我承诺:

  1. 链接以下库中的项目选项:libole32.a,liboleaut32.a,liboleacc.a,libuuid.a

  2. 包括了cassert和exdisp。 h在主cpp文件的开头。

  3. 插入主CPP文件下面的代码:


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; }