WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  ActiveX

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   ActiveX
Leo опубликован 24-03-2001 04:08 MSK   Click Here to See the Profile for Leo   Click Here to Email Leo  
Как поместить в прогу элемент ActiveX (без использования MFC), например WebBrowser ?


Flex Ferrum опубликован 26-03-2001 10:45 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Месье понимает толк в удовольствиях? :) "Без MFC" имеется в виду на голом API? Или с использованием VCL? Если на голом API - то это вгрызаться в документацию на OLE2 и ручками реализовывать кучу интерфейсов. Задача, надо отметить, не из приятных. Если же с использованием VCL - то задача упрощается на несколько порядков. Кстати, для примера можно посмотреть исходники тогоже MFC.
OlegN опубликован 28-03-2001 16:34 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
Не знаю, как на 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;

Leo опубликован 28-03-2001 20:15 MSK     Click Here to See the Profile for Leo  Click Here to Email Leo     
Спасибо, я понял.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.