Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 октября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Как поместить в прогу элемент ActiveX (без использования MFC), например WebBrowser ?


Не знаю, как на 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;

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS