65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (26投票s)

2007 年 4 月 15 日

2分钟阅读

viewsIcon

238892

downloadIcon

4881

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

Screenshot - d.jpg

引言

你可能希望使用 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_INPLACEwParam = 1 激活,wParam = 2 停用)

case WM_INITDIALOG:
{
    HWND hX = GetDlgItem(hh,801);
    SendMessage(hX,AX_INPLACE,1,0)
...

如何访问此 ActiveX 对象支持的接口? 使用 AX_QUERYINTERFACEWPARAM 作为引用 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.CPPAX.H 包含更多尚未实现(或仍然存在错误!)的代码。 我的计划是将来允许 Advise Sink 连接、OLE 菜单等。 AX 为了简单起见,实现了尽可能少的 IOleClientSite 方法。 当你进一步探索 OLE 和 ActiveX 时,你可以将你自己的实现放在那里!

使用上述 IWebBrowser2,例如,你可能需要在用户单击 URL 时收到通知。 这可以使用 IDispatch 完成,但它并不简单,我不会在这里演示它,因为它取决于你想要托管的 ActiveX 控件。

祝您好运!

© . All rights reserved.