有一段时间不写技术文章,貌似博客园的缩进样式变化了。
这个主题讲IE插件开发,又以BHO为主要内容,也谈一些其他相关的,也有一些关于ATL,和我的心得方面的。希望读者能给我一些意见,我做IE插件,确实没有什么经验。
BHO
BHO就是IE浏览器的辅助对象,我们需要编写的是一个IE进程内COM组件,要实现几个特定的接口。其实,了解COM的朋友,就不会觉得难了。
首先,一个BHO必须实现IObjectWithSite接口。
我们实现此接口,然后将BHO的CLSID添加到注册表中,由此创建一个简单的浏览器扩展。
【in VS2008 】
1. 创建一个ATL简单对象,
2. 在Options - Support里面选择支持IObjectWithSite。
3. 在.Rgs里面添加如下(类似)方法
HKLM {NoRemove SOFTWARE {
NoRemove Microsoft {
NoRemove Windows {
NoRemove CurrentVersion {
NoRemove Explorer {
NoRemove 'Browser Helper Objects' {
ForceRemove '{GUID}' = s 'BHO Name' {
val 'NoExplorer' = d '1'
} } } } } } }NoExplorer = 1,什么意思,我还没有确定。
还没有完,还得写代码~
4. 实现HRESULT SetSite(IUnknown* pUnkSite) 接口方法。
通过pUnSite可以Query到IWebBrowser2*接口。
执行JavaScript代码
可以用如下代码执行JavaScript代码:
IDispatch* pDoc = NULL;
HRESULT h = m_pWebBrowser->get_Document(&pDoc);
if (SUCCEEDED(h))
{
IHTMLWindow2* pHTMLWnd = NULL;
((IHTMLDocument2*)pDoc)->get_parentWindow(&pHTMLWnd);
if (pHTMLWnd != NULL)
{
VARIANT varRet;
// I got it;
CComBSTR jsCode = L"function a() { a = 1;alert(a * 2 + a); }a();";
HRESULT e = pHTMLWnd->execScript(jsCode, L"Javascript", &varRet);
if (SUCCEEDED(e))
{
}
... ...需要说明的是,varRet这个变量,是没法真正获取JavaScript返回值的。