在 Win32 项目中使用 ActiveX 控制,无需 MFC,通过 CreateWindowEx 或在对话框中使用






4.41/5 (26投票s)
2007 年 4 月 15 日
2分钟阅读

238892

4881
一篇关于如何在 Win32 项目中使用 ActiveX 控制,无需 MFC,通过 CreateWindowEx 或在对话框中使用 的文章

引言
你可能希望使用 Windows 和互联网上提供的众多 ActiveX 控制,但之前你可能需要使用 MFC 或 OWL 或非原生平台。解决方案就在这里!一个充当 ActiveX 容器的 HWND
!
使用代码
简而言之,AX
是一个充当 ActiveX 容器的 HWND
。 你使用 AXRegister()
注册它的类。
int __stdcall WinMain(HINSTANCE h,HINSTANCE,LPSTR,int)
{
OleInitialize(0);
if (!AXRegister())
return 0;
...
}
使用该控件很简单。 你可以使用 CreateWindowEx()
,或者在 RC
编辑器中指定 AX
控件。
DIALOG_1 DIALOGEX 0, 0, 500, 400
...
{
CONTROL "{8856F961-340A-11D0-A96B-00C04FD705A2}", 801, "AX",
WS_CHILD | WS_VISIBLE, 0, 0, 500, 400
}
作为窗口标题,你使用要创建的 ActiveX 对象的 CLSID
。 这里我使用了 Internet Explorer 的 CLSID
。 你可以使用 MS 的 OLEView 找到所有你想要的 CLSID
。
当你调用 CreateWindowEx()
或 DialogBox()
创建窗口时,ActiveX 对象将被创建,但尚未就地激活。 使用 AX_INPLACE
(wParam = 1
激活,wParam = 2
停用)
case WM_INITDIALOG:
{
HWND hX = GetDlgItem(hh,801);
SendMessage(hX,AX_INPLACE,1,0)
...
如何访问此 ActiveX 对象支持的接口? 使用 AX_QUERYINTERFACE
,WPARAM
作为引用 ID 的指针,LPARAM
作为输出接口的双指针。 我尝试使用 IWebBrowser2
。
// Navigate
IWebBrowser2* wb = 0;
SendMessage(hX,AX_QUERYINTERFACE,(WPARAM)&IID_IWebBrowser2,(LPARAM)&wb);
if (wb)
{
wb->Navigate(L"https://codeproject.org.cn",0,0,0,0);
wb->Release();
}
关注点
AX.CPP 和 AX.H 包含更多尚未实现(或仍然存在错误!)的代码。 我的计划是将来允许 Advise Sink 连接、OLE 菜单等。 AX
为了简单起见,实现了尽可能少的 IOleClientSite
方法。 当你进一步探索 OLE 和 ActiveX 时,你可以将你自己的实现放在那里!
使用上述 IWebBrowser2
,例如,你可能需要在用户单击 URL 时收到通知。 这可以使用 IDispatch
完成,但它并不简单,我不会在这里演示它,因为它取决于你想要托管的 ActiveX 控件。
祝您好运!