【问题标题】:Control existing Internet Explorer with c++使用 c++ 控制现有的 Internet Explorer
【发布时间】:2015-03-02 04:25:04
【问题描述】:

用例:有人让我自动化他的 Internet Explorer。每天,他都必须导航到相同的 URL,输入相同的凭据并登录。他希望计算机能够自动执行此操作:使用导航到 URL 的应用程序,输入帖子数据并自动登录。然后他可以继续手动浏览页面。

那么,如果我想直接控制现有的 Internet Explorer 实例,我将如何使用 C++ 来做到这一点?

【问题讨论】:

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

标签: c++ internet-explorer com


【解决方案1】:

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

我采取的步骤:

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

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

  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;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2012-02-21
    • 2018-06-04
    相关资源
    最近更新 更多