わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

ブラウザコントロールを生成する

atl.dllを利用してブラウザコントロールを作成します。 atl.dllは複数のバージョンが存在しますので、できるだけ新しいatl.dllを利用するようにしています。

対応するatl.dll

  • atl110.dll
  • atl100.dll
  • atl90.dll
  • atl80.dll
  • atl71.dll
  • atl.dll
#include <tchar.h>
#include <iostream>
#include <string>
#include <shlobj.h>
#include <comdef.h>
#include <comutil.h>
#pragma warning(push)
#pragma warning(disable:4996)
#include <atlbase.h>
#pragma warning(pop)



// Atl.dllの関数ポインタ定義
typedef BOOL(WINAPI *ATLAXWININIT)();
typedef HRESULT(WINAPI *ATLAXGETCONTROL)(HWND, IUnknown **);



/*
	ブラウザコントロールの生成
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// ロケール変更(wcoutでユニコードを出力する為)
	std::wcout.imbue(std::locale("", std::locale::ctype));

	// COMを初期化する
	CoInitialize( NULL );


	/*
		Atl.dllのロード
	*/
	HMODULE hAtl = NULL;
	std::wstring strWindowClassName;
	{
		struct {
			TCHAR* pszDllName;				// DLLの名前
			TCHAR* pszAtlAxWindowClassName;	// ウインドウクラスの名前

		} taDllInfo[] = {
			  { L"atl110.dll", L"AtlAxWin110" }
			, { L"atl100.dll", L"AtlAxWin100" }
			, { L"atl90.dll" , L"AtlAxWin90"  }
			, { L"atl80.dll" , L"AtlAxWin80"  }
			, { L"atl71.dll" , L"AtlAxWin71"  }
			, { L"atl.dll"   , L"AtlAxWin"    }
		};
		for (int nI = 0; nI < _countof(taDllInfo); nI++ ) {

			// DLLをロードしてみる
			hAtl = LoadLibrary( taDllInfo[ nI ].pszDllName );
			if ( NULL != hAtl ) {

				// ロードできたので、ウインドウクラス名を取得
				strWindowClassName = taDllInfo[ nI ].pszAtlAxWindowClassName;
				break;
			}
		}
	}

	if ( NULL == hAtl ) {

		std::wcout << L"atl.dllのロードに失敗しました。" << std::endl;
	}
	else {

		std::wcout << L"atl.dllのロードに成功しました。" << std::endl;

		// Atl.dllの関数ポインタ取得
		ATLAXWININIT    dll_AtlAxWinInit    = (ATLAXWININIT)GetProcAddress( hAtl, "AtlAxWinInit" );
		ATLAXGETCONTROL dll_AtlAxGetControl = (ATLAXGETCONTROL)GetProcAddress( hAtl, "AtlAxGetControl" );

		// Atlの初期化
		dll_AtlAxWinInit();

		// ウインドウ矩形
		RECT tRect = { 100, 100, 1000, 900 };

		/*
			ブラウザコントロールの生成
		*/
		HWND hWnd = CreateWindowEx(
				  0
				, strWindowClassName.c_str()
				, L"Shell.Explorer.2"
				, WS_OVERLAPPEDWINDOW
				| WS_TABSTOP
				| WS_VISIBLE
				, tRect.left
				, tRect.top
				, tRect.right  - tRect.left
				, tRect.bottom - tRect.top
				, NULL	// 親ウインドウハンドル
				, 0
				, (HINSTANCE)::GetModuleHandle( NULL )
				, 0
			);

		if ( NULL == hWnd ) {

			std::wcout << L"ブラウザコントロールの生成失敗" << std::endl;
		}
		else {

			std::wcout << L"ブラウザコントロールの生成成功" << std::endl;

			CComPtr<IUnknown> pUnknown;

			// ATLコントロールの取得
			if ( S_OK != dll_AtlAxGetControl( hWnd, (IUnknown**)&pUnknown ) ) {

				std::wcout << L"IUnknownの取得失敗" << std::endl;
			}
			else {

				std::wcout << L"IUnknownの取得成功" << std::endl;

				CComPtr<IWebBrowser2> pIWebBrowser2;

				// IWebBrowser2の取得
				pUnknown->QueryInterface( IID_IWebBrowser2, (VOID**)&pIWebBrowser2 );
				if ( NULL == pIWebBrowser2 ) {

					std::wcout << L"IWebBrowser2の取得失敗" << std::endl;
				}
				else {

					std::wcout << L"IWebBrowser2の取得成功" << std::endl;

					/*
						Yahoo!!のホームページを開く
					*/
					CComVariant	oNaviGateUrl( L"http://www.yahoo.co.jp" );
					CComVariant oNoUse;

					pIWebBrowser2->Navigate2( &oNaviGateUrl, &oNoUse, &oNoUse, &oNoUse, &oNoUse );
				}

				// 時間待ち(テスト用)
				::MessageBox( NULL, L"OKを押下するとブラウザを閉じます。", L"ブラウザコントロールの生成", MB_OK );
			}

			// ウインドウの破棄
			::DestroyWindow( hWnd );
		}

		// Atl.dllの破棄
		FreeLibrary( hAtl );
	}

	// COMの使用終了
	CoUninitialize();

	// 正常終了
	return( 0 );
}

実行結果

atl.dllのロードに成功しました。
ブラウザコントロールの生成成功
IUnknownの取得成功
IWebBrowser2の取得成功






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。