Com 从ActiveX控件检测IE容器
ActiveX控件检测其容器(或容器的容器)是否为Internet Explorer的好方法是什么 目前,我正在通过调用控件的IOleClientSite::GetContainer方法并检查容器是否实现了IHtmlDocument2接口来实现这一点,但现在,我想检查控件的所有祖先,看看它们是否实现了IHtmlDocumentCom 从ActiveX控件检测IE容器,com,activex,Com,Activex,ActiveX控件检测其容器(或容器的容器)是否为Internet Explorer的好方法是什么 目前,我正在通过调用控件的IOleClientSite::GetContainer方法并检查容器是否实现了IHtmlDocument2接口来实现这一点,但现在,我想检查控件的所有祖先,看看它们是否实现了IHtmlDocument 问题是该控件现在包含在CComCompositeControl中,并使用CreateActiveXControls(resourceID)方法创建,该方法将内部控件创建为
问题是该控件现在包含在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”。检查进程名覆盖了我所关心的大部分表面积,只需付出一小部分努力。我太专注于细节而看不见它。谢谢,杰斐逊。