【问题标题】:Detecting IE Container from ActiveX Control从 ActiveX 控件检测 IE 容器
【发布时间】:2009-03-25 03:36:30
【问题描述】:

ActiveX 控件检测其容器(或容器的容器)是否为 Internet Explorer 的好方法是什么?

目前,我通过调用控件的 IOleClientSite::GetContainer 方法并检查容器是否实现了 IHtmlDocument2 接口来执行此操作,但现在,我想检查所有控件的祖先,看看它们是否实现了 IHtmlDocument。

问题是该控件现在包含在 CComCompositeControl 中并使用 CreateActiveXControls(resourceID) 方法创建,该方法将内部控件创建为 CAxHostWindow 实例的子级。在这种情况下,CAxHostWindow 实例将自己报告为它自己的容器,所以我还没有找到一种向上走的方法(如果这个模型中有这样的树)。

【问题讨论】:

    标签: com activex


    【解决方案1】:

    所以,我可以想到两种方法。一种方法是获取站点的 IServiceProvider 实现和 QueryService() 以获取仅 IE 实现的某些服务。您可以在 IE 头文件中寻找 SID_S*,直到找到适合您需要的文件。

    但最好的方法(实际上,IE 内部在某些地方的方法)只是检查进程名称。

    bool GetProcessName(LPWSTR pszProcessName, DWORD cchProcessName)
    {
        bool success = false;
        // GetCurrentProcess() can't fail.
        DWORD cch = GetProcessImageFileName(GetCurrentProcess(), pszProcessName, cchProcessName);
        if (cch > 0)
        {
            LPWSTR pszFileName = PathFindFileName(pszProcessName);
            if (pszFileName)
            {
                wmemmove(pszProcessName, pszFileName, lstrlen(pszFileName) + 1);
            }
            success = true;
        }
        return success;    
    }
    

    并查看进程名是否为“iexplore.exe”。

    【讨论】:

    • 检查进程名称涵盖了我所关心的大部分表面区域,只需一小部分工作量。我太专注于细节,看不到它。谢谢,jeffamaphone。
    【解决方案2】:

    你可以通过下面的语句得到一些想法,

    ActiveX 控件通常可以访问以下容器窗口:

    • 框架窗口:容器主菜单所在的最外层容器窗口。 ActiveX 控件通过调用 IOleInPlaceFrame::GetWindow 或 IOleInPlaceSite::GetWindowContext 检索此窗口句柄。

    • 站点窗口:包含 ActiveX 控件视图的容器窗口。 ActiveX 控件通过调用 IOleInPlaceSite::GetWindow 检索此容器窗口。

    之后,您可以检查父窗口或同一窗口以查找其文本或其他属性。

    在某些情况下,尤其是从 MFC 中,ActiveX 控件成为反射器窗口的子级,其父级是从 IOleInPlaceSite::GetWindow 返回的窗口。 那样的话,就很难得到父母了..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2011-01-21
      • 2013-09-29
      • 1970-01-01
      • 2012-03-25
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多