Skip to content

Instantly share code, notes, and snippets.

@bg1bgst333
Created April 29, 2025 03:28
Show Gist options
  • Save bg1bgst333/079858e3ba723b389aa02fa31631091e to your computer and use it in GitHub Desktop.
Save bg1bgst333/079858e3ba723b389aa02fa31631091e to your computer and use it in GitHub Desktop.
CWebBrowserHost
// ヘッダのインクルード
// 既定のヘッダ
#include <stdio.h> // C標準入出力
// 独自のヘッダ
#include "MainWindow.h" // CMainWindow
// ウィンドウクラス登録関数RegisterClass.
BOOL CMainWindow::RegisterClass(HINSTANCE hInstance) {
// ウィンドウクラス名は"CMainWindow".
return CWindow::RegisterClass(hInstance, _T("CMainWindow")); // CWindow::RegisterClassでウィンドウクラス名"CMainWindow"を登録.
}
// ウィンドウクラス登録関数RegisterClass.(メニュー名指定バージョン)
BOOL CMainWindow::RegisterClass(HINSTANCE hInstance, LPCTSTR lpctszMenuName) {
// メニュー名はlpctszMenuName.
return CWindow::RegisterClass(hInstance, _T("CMainWindow"), lpctszMenuName); // CWindow::RegisterClassで, ウィンドウクラス名"CMainWindow", メニュー名lpctszMenuNameを登録.
}
// ウィンドウクラス登録関数RegisterClass.(メニュー名, 色指定バージョン)
BOOL CMainWindow::RegisterClass(HINSTANCE hInstance, LPCTSTR lpctszMenuName, int i) {
// メニュー名はlpctszMenuName, 色はi.
return CWindow::RegisterClass(hInstance, _T("CMainWindow"), lpctszMenuName, i); // CWindow::RegisterClassで, ウィンドウクラス名"CMainWindow", メニュー名lpctszMenuName, 色はiを登録.
}
// コンストラクタCMainWindow()
CMainWindow::CMainWindow() {
// メンバの初期化.
m_pWebBrowserHost = NULL; // m_pWebBrowserHostをNULLで初期化.
}
// デストラクタ~CMainWindow()
CMainWindow::~CMainWindow() {
// メンバの終了処理.
Destroy(); // Destroyで子ウィンドウの破棄.
}
// ウィンドウ作成関数Create.(ウィンドウクラス名省略バージョン.)
BOOL CMainWindow::Create(LPCTSTR lpctszWindowName, DWORD dwStyle, int x, int y, int iWidth, int iHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance) {
// ウィンドウクラス名は"CMainWindow".
return CWindow::Create(_T("CMainWindow"), lpctszWindowName, dwStyle, x, y, iWidth, iHeight, hWndParent, hMenu, hInstance); // CWindow::Createにウィンドウクラス名"CMainWindow"を指定.
}
// ウィンドウ破棄関数Destroy
BOOL CMainWindow::Destroy() {
// 変数の初期化.
BOOL bRet = FALSE; // bRetをFALSEで初期化.
// DestroyChildrenを分けたので, 自身のウィンドウ破棄は問題ない.
// まず子ウィンドウの破棄.
DestroyChildren();
// 自身のウィンドウ破棄.
bRet = CWindow::Destroy(); // 戻り値をbRetに格納.
// bRetを返す.
return bRet;
}
// 子ウィンドウ破棄関数DestroyChildren
BOOL CMainWindow::DestroyChildren() {
// 変数の初期化.
BOOL bRet = FALSE; // bRetをFALSEで初期化.
// ウェブブラウザホストの破棄.
if (m_pWebBrowserHost != NULL) { // NULLでなければ.
bRet = m_pWebBrowserHost->Destroy(); // m_pWebBrowserHost->Destroyでウィンドウを破棄.
delete m_pWebBrowserHost; // deleteでm_pWebBrowserHostを解放.
m_pWebBrowserHost = NULL; // NULLをセット.
}
// 破棄したらTRUEを返す.
if (bRet) { // TRUEなら.
return TRUE; // TRUEを返す.
}
// 破棄しなければ, CWindowのDestroyChildrenを返す.
return CWindow::DestroyChildren(); // CWindow::DestroyChildrenを返す.
}
// ウィンドウの作成が開始された時.
int CMainWindow::OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) {
// ウェブブラウザホストオブジェクトの作成.
m_pWebBrowserHost = new CWebBrowserHost(); // CWebBrowserHostオブジェクトの作成.
// ウェブブラウザホストのウィンドウ作成.
m_pWebBrowserHost->Create(_T(""), WS_BORDER, 50, 50, 320, 240, hwnd, (HMENU)(WM_APP + 1), lpCreateStruct->hInstance); // Createでウェブブラウザホストのウィンドウ作成.
// 親クラスのOnCreateを呼ぶ.
m_hInstance = lpCreateStruct->hInstance;
int iRet = CWindow::OnCreate(hwnd, lpCreateStruct); // CWindow::OnCreateを呼び, 戻り値を返す.
return iRet;
}
// ウィンドウが破棄された時.
void CMainWindow::OnDestroy() {
// CWindowのOnDestroyを呼ぶ.
CWindow::OnDestroy(); // CWindow::OnDestroyを呼ぶ.
}
// ウィンドウのサイズが変更された時.
void CMainWindow::OnSize(UINT nType, int cx, int cy) {
}
// ウィンドウが閉じられる時.
int CMainWindow::OnClose() {
// メッセージボックスで"Close CMainWindow OK?"と表示.
int iRet = MessageBox(m_hWnd, _T("Close CMainWindow OK?"), _T("CWebBrowserHost"), MB_OKCANCEL); // MessageBoxで"Close CMainWindow OK?"と表示し, 戻り値をiRetに格納.
if (iRet != IDOK) { // OK以外.(Cancelなど.)
return -1; // -1を返す.
}
// このウィンドウの破棄.(OnCloseの後, ウィンドウの破棄処理が勝手に行われるので, Destroyは不要なのでコメントアウト.)
//Destroy(); // Destroyでこのウィンドウの破棄処理.
// OKなので閉じる.
return CWindow::OnClose(); // 親クラスのOnCloseを呼ぶ.(親クラスのOnCloseは常に閉じる処理になっている.)
}
// ヘッダのインクルード
// 独自のヘッダ
#include "WebBrowserHost.h" // CWebBrowserHost
// コンストラクタCWebBrowserHost
CWebBrowserHost::CWebBrowserHost() : CUserControl() {
// メンバの初期化
m_pWebBrowser2 = NULL; // m_pWebBrowser2をNULLで初期化.
}
// デストラクタ~CWebBrowserHost
CWebBrowserHost::~CWebBrowserHost() {
}
// ウィンドウクラス登録関数RegisterClass.(ウィンドウクラス名省略バージョン.)
BOOL CWebBrowserHost::RegisterClass(HINSTANCE hInstance) {
// ウィンドウクラスの登録.
return CUserControl::RegisterClass(hInstance, _T("CWebBrowserHost")); // CUserControl::RegisterClassでウィンドウクラス名"CWebBrowserHost"を登録.
}
// ウィンドウクラス登録関数RegisterClass.
BOOL CWebBrowserHost::RegisterClass(HINSTANCE hInstance, LPCTSTR lpctszClassName) {
// ウィンドウクラス名にはlpctszClassNameを指定.
return CUserControl::RegisterClass(hInstance, lpctszClassName); // CUserControl::RegisterClassでウィンドウクラス名lpctszClassNameを登録.
}
// ウィンドウ作成関数Create.(ウィンドウクラス名省略バージョン.)
BOOL CWebBrowserHost::Create(LPCTSTR lpctszWindowName, DWORD dwStyle, int x, int y, int iWidth, int iHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance) {
// ウィンドウクラス名は"CWebBrowserHost".
return CUserControl::Create(_T("CWebBrowserHost"), lpctszWindowName, dwStyle | WS_CHILD | WS_VISIBLE, x, y, iWidth, iHeight, hWndParent, hMenu, hInstance); // CUserControl::Createにウィンドウクラス名"CWebBrowserHost"を指定.
}
// ウィンドウ作成関数Create.
BOOL CWebBrowserHost::Create(LPCTSTR lpctszClassName, LPCTSTR lpctszWindowName, DWORD dwStyle, int x, int y, int iWidth, int iHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance) {
// ウィンドウクラス名にはlpctszClassNameを指定.
return CUserControl::Create(lpctszClassName, lpctszWindowName, dwStyle | WS_CHILD | WS_VISIBLE, x, y, iWidth, iHeight, hWndParent, hMenu, hInstance); // CUserControl::Createにウィンドウクラス名lpctszClassNameを指定.
}
// ブラウザの初期化関数InitBrowser
BOOL CWebBrowserHost::InitBrowser() {
// IWebBrowser2ポインタを取得.
HRESULT hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pWebBrowser2)); // CoCreateInstanceでIWebBrowser2ポインタを取得.
if (FAILED(hr)) { // 失敗.
OutputDebugString(_T("IWebBrowser2 NG!\n")); // "IWebBrowser2 NG!"と出力.
return FALSE; // FALSEを返す.
}
OutputDebugString(_T("IWebBrowser2 OK!\n")); // "IWebBrowser2 OK!"と出力.
return TRUE; // TRUEを返す.
}
// ウィンドウ破棄関数Destroy
BOOL CWebBrowserHost::Destroy() {
// 親クラスのDestroyを呼ぶ.
return CUserControl::Destroy(); // CUserControl::Destroyを呼ぶ.
}
// ウィンドウの作成が開始された時.
int CWebBrowserHost::OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) {
// ブラウザ初期化.
BOOL bRet = InitBrowser(); // InitBrowserでブラウザ初期化.
if (!bRet) { // 失敗.
return -1; // -1を返す.
}
return 0; // 0を返すと, ウィンドウ作成に成功したということになる.
}
// ウィンドウが破棄された時.
void CWebBrowserHost::OnDestroy() {
// IWebBrowser2ポインタの破棄.
if (m_pWebBrowser2 != NULL) { // NULLでない.
m_pWebBrowser2->Release(); // Releaseで破棄.
m_pWebBrowser2 = NULL; // NULLをセット.
}
}
// 二重インクルード防止
#ifndef __WEB_BROWSER_HOST_H__
#define __WEB_BROWSER_HOST_H__
// ヘッダのインクルード
// 既定のヘッダ
#include <shlobj.h> // シェルオブジェクト
// 独自のヘッダ
#include "UserControl.h" // CUserControl
// ウェブブラウザホストクラスCWebBrowserHost
class CWebBrowserHost : public CUserControl {
// privateメンバ
private:
// privateメンバ変数
IWebBrowser2* m_pWebBrowser2; // IWebBrowser2ポインタm_pWebBrowser2
// publicメンバ
public:
// publicメンバ関数
// コンストラクタ・デストラクタ
CWebBrowserHost(); // コンストラクタCWebBrowserHost
virtual ~CWebBrowserHost(); // デストラクタ~CWebBrowserHost
// staticメンバ関数
static BOOL RegisterClass(HINSTANCE hInstance); // ウィンドウクラス登録関数RegisterClass.(ウィンドウクラス名省略バージョン.)
static BOOL RegisterClass(HINSTANCE hInstance, LPCTSTR lpctszClassName); // ウィンドウクラス登録関数RegisterClass
// メンバ関数
virtual BOOL Create(LPCTSTR lpctszWindowName, DWORD dwStyle, int x, int y, int iWidth, int iHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance); // ウィンドウ作成関数Create.(ウィンドウクラス名省略バージョン.)
virtual BOOL Create(LPCTSTR lpctszClassName, LPCTSTR lpctszWindowName, DWORD dwStyle, int x, int y, int iWidth, int iHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance); // ウィンドウ作成関数Create.
virtual BOOL InitBrowser(); // ブラウザの初期化関数InitBrowser
virtual BOOL Destroy(); // ウィンドウ破棄関数Destroy
virtual int OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct); // ウィンドウの作成が開始された時.
virtual void OnDestroy(); // ウィンドウが破棄された時.
};
#endif
// ヘッダのインクルード
// 独自のヘッダ
#include "MainApplication.h" // CMainApplication
// _tWinMain関数の定義
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) {
// 変数・オブジェクトの宣言・初期化.
CMainApplication app; // CMainApplicationオブジェクトapp.
HRESULT hr; // COMの初期化の結果を格納するhr.
TCHAR tszText[256] = { 0 }; // 表示するテキストtszText(長さ256)を{0}で初期化.
// OLEの初期化
hr = OleInitialize(NULL); // OleInitializeにNULLを渡して初期化.
if (hr == S_OK) { // S_OKなら初期化成功.
_stprintf(tszText, _T("OleInitialize success!\n")); // "OleInitialize success!"をtszTextにセット.
OutputDebugString(tszText); // OutputDebugStringでtszTextを出力.
}
else if (hr == S_FALSE) { // S_FALSEならすでに初期化されている.
_stprintf(tszText, _T("Already initialized!\n")); // "Already initialized!"をtszTextにセット.
OutputDebugString(tszText); // OutputDebugStringでtszTextを出力.
}
else { // それ以外.
_stprintf(tszText, _T("Failed!\n")); // "Failed!"をtszTextにセット.
OutputDebugString(tszText); // OutputDebugStringでtszTextを出力.
return -1; // -1を返して異常終了.
}
// インスタンスの初期化.
if (!app.InitInstance(hInstance, lpCmdLine, nShowCmd)) { // app.InitInstanceがFALSEの場合.
// 異常終了.
app.ExitInstance(); // app.ExitInstanceで終了処理を実行.
// OLEの終了処理.
OleUninitialize(); // OleUninitializeで終了処理.
return -1; // returnで-1を返して異常終了.
}
// メッセージループ処理.
int iRet = app.Run(); // app.Runの戻り値をiRetに格納.
// OLEの終了処理.
OleUninitialize(); // OleUninitializeで終了処理.
return iRet; // iRetを返して終了.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment