在现代软件开发中,自动化浏览器操作是一项常见的需求。这通常涉及到打开浏览器,填写表单,以及以编程方式提交数据。实现这一功能的一种常见方法是使用Microsoft提供的DLL库,例如shdocvw.dll(Microsoft Web Browser控制)和Mshtml.dll(HTML解析和渲染组件)。然而,这种方法可能会带来一些问题,比如需要分发这些DLL文件,以及需要部署一个8MB大小的Microsoft.mshtml.dll,因为该DLL不是.NET框架的一部分。
为了解决这些问题,可以使用晚期绑定技术,编写自己的DLL包装器。这样,就可以避免检查文档下载操作是否完成的问题,因为IEHelper会自动为处理这些。
晚期绑定技术是一种强大的方法,可以在不直接依赖特定DLL的情况下,与COM组件进行交互。这种方法在Ariadne的文章中有详细的解释。但是,需要知道的是,如何附加到COM事件,这对于查询文档下载操作是否完成至关重要。
以下是如何连接到Web浏览器事件的示例代码:
private IConnectionPointContainer connectionPointContainer;
private IConnectionPoint connectionPoint;
private int pdwCookie = 0;
private void registerDocumentEvents()
{
connectionPointContainer = IeApplication as IConnectionPointContainer;
Guid guid = new Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D");
connectionPointContainer.FindConnectionPoint(ref guid, out connectionPoint);
browserEvents = new DWebBrowserEvents2_Helper();
connectionPoint.Advise(browserEvents, out pdwCookie);
DocumentStatus ds = DocumentStatus.Instance;
ds.DownloadComplete = false;
}
在连接到Web浏览器事件后,需要使用一个单例类来查询文档状态。DocumentStatus类就是这样的一个单例类。当从DocumentComplete事件中得到反馈后,将DownloadComplete设置为true,以便代码可以继续执行。
void DWebBrowserEvents2.DocumentComplete(object pDisp, ref object URL)
{
DocumentStatus ds = DocumentStatus.Instance;
ds.DownloadComplete = true;
}
当然,当完成操作后,需要注销事件。
private void unregisteDocumentEvents()
{
connectionPoint.Unadvise(pdwCookie);
Marshal.ReleaseComObject(connectionPoint);
}
如果想了解如何编写这些COM包装器,可以给一个提示:使用aurigma的Comto.net。
以下是如何使用IEHelper的示例代码:
IEHelper ie = new IEHelper();
ie.OpenAVisibleBlankDocument();
object p = null;
string url = @"http://mail.google.com/mail/?hl=en&tab=wm";
bool ret = ie.Navigate(url, ref p, ref p, ref p, ref p, ref p);
ie.SetValueById("Email", txtUserName.Text);
ie.SetValueById("Passwd", txtPassword.Text);
ie.ClickButtonByName("signIn");
void DWebBrowserEvents2.OnQuit()
{
throw new Exception("The method or operation is not implemented.");
}