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の取得成功