BHO は Explorer と Internet Explorer が水面下で読み込むオブジェクトです。
各プロセスごとにロードされます。
(Shell 4.71以降)
[ATL COM AppWizard] で ダイナミックライブラリ(DLL) のプロジェクトを新規作成します。
[挿入(I)] メニュー → [ATLオブジェクトの新規作成]、
カテゴリの [オブジェクト] → [InternetExplorerオブジェクト] を選びます。
レジストリスクリプトファイル(.RGS) に
HKLM
{
SOFTWARE
{
Microsoft
{
Windows
{
CurrentVersion
{
Explorer
{
NoRemove 'Browser Helper Objects'
{
ForceRemove {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
}
}
}
}
}
}
}
を追加すれば、出来上がりです。
({xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 部分は Wizard で生成された CLSID)
オブジェクトのクラスの IObjectWithSiteImpl の SetSite() メソッドをオーバーライドします。
#include<exdisp.h>
class ATL_NO_VTABLE cXXXX :
,public IObjectWithSiteImpl<cXXXX>
...
{
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;
STDMETHODIMP cXXXX::SetSite(IUnknown *pUnkSite)
{
if (pUnkSite) {
m_spWebBrowser2 = pUnkSite; // m_spWebBrowser2 に保持
}
return IObjectWithSiteImpl<cXXXX>::SetSite(pUnkSite);
}
...
};
できてません。
ActiveX Control を使う ATL篇 のイベントの接続 の CWindow を使わない場合を参考にしてください。