Com 从ActiveX控件检测IE容器

Com 从ActiveX控件检测IE容器,com,activex,Com,Activex,ActiveX控件检测其容器(或容器的容器)是否为Internet Explorer的好方法是什么 目前,我正在通过调用控件的IOleClientSite::GetContainer方法并检查容器是否实现了IHtmlDocument2接口来实现这一点,但现在,我想检查控件的所有祖先,看看它们是否实现了IHtmlDocument 问题是该控件现在包含在CComCompositeControl中,并使用CreateActiveXControls(resourceID)方法创建,该方法将内部控件创建为

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

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


问题是该控件现在包含在CComCompositeControl中,并使用CreateActiveXControls(resourceID)方法创建,该方法将内部控件创建为CAxHostWindow实例的子控件。在本例中,CAxHostWindow实例将自己报告为自己的容器,因此我没有找到一种方法来遍历树(如果此模型中有这样的树)。

您可以通过以下语句了解一些情况

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

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

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

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

在某些场景中,特别是在MFC中,ActiveX控件是reflector窗口的子窗口,其父窗口是从IOleInPlaceSite::GetWindow返回的窗口。
在这种情况下,很难获得父级..

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

但最好的方法(事实上,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”。

检查进程名覆盖了我所关心的大部分表面积,只需付出一小部分努力。我太专注于细节而看不见它。谢谢,杰斐逊。