Skip to content

Instantly share code, notes, and snippets.

@kumatti1
Last active August 29, 2015 14:18
Show Gist options
  • Save kumatti1/006866b24acfda9f732a to your computer and use it in GitHub Desktop.
Save kumatti1/006866b24acfda9f732a to your computer and use it in GitHub Desktop.
BHO

Visual Studio 2005 によるブラウザ ヘルパ オブジェクトのビルド https://msdn.microsoft.com/ja-jp/library/bb250489(v=vs.85).aspx

方法: /clr を使用して MFC および ATL コードをコンパイルする https://msdn.microsoft.com/ja-jp/library/ms235211.aspx

ATLのコードを、C++/CLIでビルドする方法 - C++/CLI - 社本@元ネオニート Blog http://www.ailight.jp/Blog/sha256/archive/2006/5/12/ATL%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%80%81CCLI%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%20-%20CCLI

#pragma once
#using <System.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;
[ComImport, Guid("00000118-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType::InterfaceIsIUnknown)]
interface class IOleClientSite2
{
};
public ref class Hoge : IOleClientSite2
{
public:
[DispId(-5512]//DISPID_AMBIENT_DLCONTROL
long _DL_CTL()
{
return 0x400;//NO_DLACTIVEXCTLS
}
};
// dllmain.cpp : DllMain の実装
#include "stdafx.h"
#include "resource.h"
#include "HelloWorld_i.h"
#include "dllmain.h"
CHelloWorldModule _AtlModule;
// DLL エントリ ポイント
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hInstance);
}
return _AtlModule.DllMain(dwReason, lpReserved);
}
// HelloWorldBHO.cpp : CHelloWorldBHO の実装
#include "stdafx.h"
#include "HelloWorldBHO.h"
#using <System.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;
[ComImport, Guid("00000118-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType::InterfaceIsIUnknown)]
interface class IOleClientSite2
{
};
public ref class Hoge : IOleClientSite2
{
public:
// これが親プロセスから呼び出される関数
[DispId(-5512)]
long dlc()
{
return 0x400;
}
};
STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL)
{
// IWebBrowser2 へのポインタをキャッシュします。
pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
if (m_spWebBrowser)
{
auto obj = gcnew Hoge;
pDisp.Attach(static_cast<IDispatch*>(Marshal::GetIDispatchForObject(obj).ToPointer()));
pOleClientSite = pDisp;
pOleObject = m_spWebBrowser;
pOleObject->SetClientSite(pOleClientSite);
}
}
else
{
//実装した(実装してないけど)
//IOleClientSiteのメンバが呼び出される前に
//解放する
pOleObject->SetClientSite(nullptr);
pOleObject.Release();
pOleClientSite.Release();
pDisp.Release();
// ここで、キャッシュしたポインタなどのリソースを解放します。
m_spWebBrowser.Release();
}
// 基本クラスの実装に戻ります。
return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
}
// HelloWorldBHO.h : CHelloWorldBHO の宣言
#pragma once
#include "resource.h" // メイン シンボル
//#include <atlcomcli.h>
//#include <OleIdl.h>
#include "HelloWorld_i.h"
#include <shlguid.h> // IID_IWebBrowser2、DIID_DWebBrowserEvents2 など
#include <exdispid.h> // DISPID_DOCUMENTCOMPLETE など
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "DCOM の完全サポートを含んでいない Windows Mobile プラットフォームのような Windows CE プラットフォームでは、単一スレッド COM オブジェクトは正しくサポートされていません。ATL が単一スレッド COM オブジェクトの作成をサポートすること、およびその単一スレッド COM オブジェクトの実装の使用を許可することを強制するには、_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA を定義してください。ご使用の rgs ファイルのスレッド モデルは 'Free' に設定されており、DCOM Windows CE 以外のプラットフォームでサポートされる唯一のスレッド モデルと設定されていました。"
#endif
using namespace ATL;
// CHelloWorldBHO
class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
public IObjectWithSiteImpl<CHelloWorldBHO>,
public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CHelloWorldBHO()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_HELLOWORLDBHO)
DECLARE_NOT_AGGREGATABLE(CHelloWorldBHO)
BEGIN_COM_MAP(CHelloWorldBHO)
COM_INTERFACE_ENTRY(IHelloWorldBHO)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(SetSite)(IUnknown *pUnkSite);
private:
CComPtr<IWebBrowser2> m_spWebBrowser;
CComQIPtr<IOleClientSite> pOleClientSite;
CComQIPtr<IOleObject> pOleObject;
CComQIPtr<IDispatch> pDisp;
};
OBJECT_ENTRY_AUTO(__uuidof(HelloWorldBHO), CHelloWorldBHO)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment