Introduction
You would really like to use the multitude of ActiveX controls available in Windows and on the Internet, however you did have to use MFC or OWL or a non native platform. The solution is here! A HWND
that acts as an ActiveX container!
Using the code
In short, AX
is a HWND
that acts as an ActiveX container. You register its class with AXRegister()
:
int __stdcall WinMain(HINSTANCE h,HINSTANCE,LPSTR,int)
{
OleInitialize(0);
if (!AXRegister())
return 0;
...
}
Using the control is easy. You either use CreateWindowEx()
, or specify the AX
control within the RC
editor:
DIALOG_1 DIALOGEX 0, 0, 500, 400
...
{
CONTROL "{8856F961-340A-11D0-A96B-00C04FD705A2}", 801, "AX",
WS_CHILD | WS_VISIBLE, 0, 0, 500, 400
}
As the Window Title, you use the CLSID
of the ActiveX object you wish to create. Here I used the CLSID
of Internet Explorer. You can find all the CLSID
s you want by using MS's OLEView.
When you call CreateWindowEx()
or DialogBox()
to create the window, the ActiveX object will be created, but it won't as yet be activated in place. Use AX_INPLACE
(wParam = 1
to Activate , wParam = 2
to deactivate):
case WM_INITDIALOG:
{
HWND hX = GetDlgItem(hh,801);
SendMessage(hX,AX_INPLACE,1,0)
...
And how do you access the interfaces that this ActiveX object supports? Use AX_QUERYINTERFACE
, with WPARAM
as a pointer to the reference ID, and LPARAM
as a double pointer to the output interface. I try this with IWebBrowser2
:
IWebBrowser2* wb = 0;
SendMessage(hX,AX_QUERYINTERFACE,(WPARAM)&IID_IWebBrowser2,(LPARAM)&wb);
if (wb)
{
wb->Navigate(L"http://www.codeproject.com",0,0,0,0);
wb->Release();
}
Points of Interest
AX.CPP and AX.H contain more code, not yet implemented (or yet buggy!) . My plan is to allow Advise Sink connections, OLE menus etc. in the future. AX
implements as few as possible of the IOleClientSite
methods, for simplicity. When you further explore OLE and ActiveX, you put your own implementations there!
With the above IWebBrowser2
, for example, you might need to get notified when the user clicks on a URL. This can be done using IDispatch
, but it isn't simple and I won't demonstrate it here, because it depends on the ActiveX control you want to host.
Good luck!