Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   ActiveX control c пониманием дела :-) (без MFC и ATL) (http://forum.oszone.net/showthread.php?t=52276)

Sharkky 02-08-2005 11:17 345367

ActiveX control c пониманием дела :-) (без MFC и ATL)
 
Не могу найти примера, где создавался бы реальный ActiveX control без использования ATL или MFC.
Если у кого-нибудь есть такой tutorial или знаете где взять, помогите plz.

В принципе, туториал может быть и не нужен. Нужен ответ на вопрос, чем отилчаются друг от друга ActiveX, COM и OLE?
Я понимаю что такое COM. Помогите найти определение, что такое ActiveX.

Какие интерфейсы должен имплементировать COM-объект, чтобы он мог смог отображать себя в окне клиентской программы?
На уровне моего понимания, последний вопрос сформулирован правильно. Это вопрос, ответ на который для меня наиболее интересен. Если же на него нельзя дать ответ (неправильный вопрос), то объясните почему :-)

Илья.

pva 10-08-2005 14:11 347203

Почитай туторал (хотя бы борландовский).
COM - достаточно описать IUnknown
OLE - COM + твой класс-сервер должен предоставлять кучк интерфейсов, связанных со встраиванием твоего документа в чужую программу.
ActiveX - OLE + Ты должен описать метаданные твоего класса, т.е. IDispatch, typelib
В хелпе приведены подробные списки интерфейсов, какой за что отвечает и примеры реализации
Цитата:

Это вопрос, ответ на который для меня наиболее интересен
...Надо же, нашёл хелп на этой машине:
IOleWindow The base interface. Implemented and used by containers and objects to window handles and manage context-sensitive help.
IOleInPlaceObject Implemented by objects and used by an object's immediate container to activate and deactivate the object.
IOleInPlaceActiveObject Implemented by objects and used by the top-level container to manipulate the object while it is active. Provides a direct channel of communication between an active object and its frame and document windows.
IOleInPlaceUIWindow Implemented by containers and used by objects to manipulate the container's document window.
IOleInPlaceFrame Implemented by containers and used by objects to control the container's frame window.
IOleInPlaceSite Implemented by containers and used by objects to interact with the in-place client site.
These interfaces can be arranged in three hierarchical levels with various interfaces implemented at each level. Calls that install user-interface menus and frame adornments, activate and switch between windows, and dispatch menu and keystrokes take place between the top-level container and the active object. Calls that support activating, deactivating, scrolling, or clipping span the containment hierarchy, with each level performing the correct actions.

When to Implement

The inherited methods of this interface are implemented by all in-place objects and containers.

When to Use

Use this interface to obtain the window handle to the windows associated with in-place activation (frame, document, parent, and in-place object). It is also used to enter and exit context-sensitive help.

Sharkky 16-08-2005 23:08 348574

Спасибо за ответ!

Но я всё равно не могу добиться того чего хочу. Мне нужно получить ActiveX-дилог. То есть, чтобы у меня было окошко с набором элементов управления, которое бы умело отображаться в IE.

Прямых рецептов как это сделать я не нашёл. Я не понимаю где "котейнер" берет окно "элемента управления".
Я попробовал написать COM объект, который бы имплеметировал IOleWindow::GetWindow. Думал, что контейнер дёргает эту функцию, когда хочет элемент отобразить. В моей реализации создавалось окно с текстом. Это окно я хотел выдавать через GetWindow. Однако в IE как оторажался белый квадрат, так отображается. :-(

Sharkky 19-08-2005 09:33 349181

Мне нужно сделать, чтобы в качестве ActiveX-элемента в окне эксплорера отображался диалог.
Это нужно сделать без использования MFC или ATL.
Я понимаю как можно сделать, чтобы элемент себя отрисовывал на контекте. Но в случае с дилогом
это не подходит. Нужно каким-то обрахом передавать контейнеру окно диалога.
(Или не нужно? Поправте меня). Однако у меня так и не получилось создать окно с закрашенной,
клиентской частью, и передать его контейнеру так, чтобы оно отобразилось в IE.
Я попытался сделать это следующим образом:
1. Имплементировал IOleInPlaceActiveObject и IOleObject
2. в реализации метода SetClientSite сделал m_pFrame->SetActiveObject(this, NULL).
Код:

virtual HRESULT STDMETHODCALLTYPE SetClientSite(
                        /* [unique][in] */ IOleClientSite *pClientSite)
                {
                        m_pClientSite = pClientSite;
                        CComPtr<IOleInPlaceSite> pInPlaceSite;
                       
                        OLEINPLACEFRAMEINFO frameInfo;
                        RECT posRect, clipRect;
                        HRESULT hr = m_pClientSite.QueryInterface(&pInPlaceSite);
                          if(hr == S_OK) hr = pInPlaceSite->GetWindowContext(&m_pFrame, &pUIWin, &posRect, &clipRect, &frameInfo);
                        if(hr == S_OK) hr = m_pFrame->SetActiveObject(this, NULL);

                        ....
                }

3. После этого начал вызываться метод GetWindow моего копанента. В этом методе я создаю окно, в оконной процедуре,
которого, при обработке WM_PAINT, клиентская часть заполняется цветом десктопа.

Однако это не приводит к желаемому результату. Окно activex-элемента в IE так и остаётся белым.
Чтобы донести до контейнера, что нужно отрисовывать окно, я пробовал вызывать. m_pFrame->Show,
m_pClientSite->OnInPlaceActivate(), pInPlaceSite->OnUIActivate(); m_pClientSite->ShowObject()
m_pFrame->GetWindow(&hwnd); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd);
Не помогает. Во время выполненеия программы ни разу не было послано сообщение WM_PAINT моему окну.

Sharkky 19-08-2005 16:12 349288

Отбой! Проблема разрешилась (частично)


Время: 16:22.

Время: 16:22.
© OSzone.net 2001-