опубликован 28-03-2001 16:34 MSK
Не знаю, как на VCL, но на ATL эта задача решается на УРА !Пример из www.codeguru.com :
AtlAxWinInit();
HWND hWnd = CreateWindow( TEXT("AtlAxWin"), TEXT("Some.control.1"),
WS_CHILD | WS_VISIBLE, x, y, cx, cy, hWndParent, NULL, hInst, NULL);
Но если ты не хочешь линковать к своей проге
atl.dll (может появиться такое желание :-)),
то могу поделиться идеей как в API проге использовать шаблоны и классы ATL не подгружая atl.dll
// AxContainer.h file
// Эту функцию вызываешь при старте приложения
void AxContInit(HINSTANCE hInstance);
// Эта функция необходима для получения требуемого интерфейса из ActiveX окна
HRESULT QueryControl(HWND hCtrl, REFIID riid, void* *ppvObject);
// AxContainer.cpp file
// !!! низззя включать #include "stdafx.h"
#include "atlbase.h"
// имитируем CComModule класс, экземляр которого находится в Atl.dll
class CMyComModule : public _ATL_MODULE
{
public:
CMyComModule() { memset(this, 0, sizeof(_ATL_MODULE)); cbSize = sizeof(_ATL_MODULE); }
HRESULT CreateInstance(void* /*pfnCreateInstance*/, REFIID /*riid*/, void** /*ppvObj*/)
{
ATLASSERT(FALSE);
return E_NOTIMPL;
}
LONG Lock() { return 1; }
LONG Unlock() { return 1; }
HRESULT AddTermFunc(_ATL_TERMFUNC* pFunc, DWORD dw)
{
return AtlModuleAddTermFunc(this, pFunc, dw);
}
HINSTANCE GetModuleInstance() {return m_hInst;}
void AddCreateWndData(_AtlCreateWndData* pData, void* pObject)
{
AtlModuleAddCreateWndData(this, pData, pObject);
}
void* ExtractCreateWndData()
{
return AtlModuleExtractCreateWndData(this);
}
};
// Создаем собственный статический объект _Module
// он используется в atlcom.h и в AtlHost.h
CMyComModule _Module;
#include "atlcom.h"
#include "AtlHost.h"
#include "AxContainer.h"
void AxContInit(HINSTANCE hInstance)
{
if(AtlModuleInit(&_Module, 0, hInstance) == S_OK)
AtlAxWinInit();
}
HRESULT QueryControl(HWND hCtrl, REFIID riid, void* *ppvObject)
{
IAxWinHostWindow* pAxWindow = (IAxWinHostWindow*)::GetWindowLong(hCtrl, GWL_USERDATA);
if(pAxWindow != NULL)
return pAxWindow->QueryControl(riid, ppvObject);
return E_FAIL;
}
Ну а теперь все просто :
в WinMain вызываешь AxContInit
Когда нужно создать WebBrowser ActiveX
пишешь следующий код :
m_hWnd = CreateWindow("AtlAxWin", "Shell.Explorer"),
WS_CHILD | WS_VISIBLE, x, y, cx, cy, hWndParent, NULL, hInst, NULL);
if(QueryControl(m_hWnd, IID_IWebBrowser2, (void**)&m_pBrowserApp) != S_OK)
{
m_pBrowserApp = NULL;
DestroyWindow();
return FALSE;
}
return TRUE;