atl.dllを利用してブラウザコントロールを作成します。 atl.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の取得成功