如何取得IE里COM组件所在的页面的URL地址

shines77 2005-06-23 03:47:27
可以通过COM组件的窗口句柄hwnd,得到其父窗体的句柄,然后用MACC(oleacc.dll)的函数,取得HTMLDocument接口,然后经过转换得到IWebBroswer2接口,再调用get_LocationURL()方法,但是得到的是当前IE窗口的地址栏的URL,如果控件放在IE的iframe窗口里则无法获得正确的URL

比如控件在http://www.abc.com/b.htm,IE的主窗体页面是http://www.abc.com/a.htm
http://www.abc.com/b.htm 用iframe嵌套在a.htm里面,现在获得的URL是http://www.abc.com/a.htm,而不是正确的b.htm

奇怪的是嵌套的iframe没有窗口句柄,否则即好办了
...全文
242 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ioioio 2005-06-24
  • 打赏
  • 举报
回复
mark
shines77 2005-06-24
  • 打赏
  • 举报
回复
在jiangsheng(蒋晟.MSMVP2004Jan)的提示下,运用google大法,搞定了

BOOL XDDDDDObject::GetLocationURL(BSTR *strURL)
{
CComPtr<IOleContainer> spContainer;
m_spClientSite->GetContainer(&spContainer);
CComQIPtr<IHTMLDocument2> spDoc = spContainer;
CComQIPtr<IWebBrowser2> pWebBrowser;
if (spDoc)
{
// 已经得到了 IHTMLDocument2 的接口指针
CComQIPtr<IHTMLWindow2> spWin2;
CComQIPtr<::IServiceProvider> isp; // 为什么要加::,原因是我使用了using namaspace shockwaveflash;
HRESULT hr = spDoc->get_parentWindow(&spWin2);
if (FAILED(hr))
return hr;
isp = spWin2;
//spWin2->QueryInterface(IServiceProvider, &isp); // 上面那句换成这个也可以
CComQIPtr<IWebBrowserApp> iwba;
// SID_SWebBrowserApp 和 IID_IWebBrowserApp 定义是一样的
hr = isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba);
if (FAILED(hr))
return hr;
hr = isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&pWebBrowser);
if (FAILED(hr))
return hr;

hr = pWebBrowser->get_LocationURL(strURL);
if (FAILED(hr))
return hr;
return S_OK;
}
return S_FALSE;
}

// 另外一个版本,随你的喜好了,没测试过
HRESULT CCDlgSell::GetLocationURL(BSTR *strURL)
{
USES_CONVERSION;
LPOLECLIENTSITE lpClientSite = NULL;
GetClientSite(&lpClientSite);

//ASSERT(lpClientSite != NULL);

LPOLECONTAINER lpContainer;
HRESULT hr = lpClientSite->GetContainer(&lpContainer);
if (FAILED(hr))
return hr;

IServiceProvider* lpServiceProvider;
hr = lpContainer->QueryInterface(IID_IServiceProvider, (void**)&lpServiceProvider);
lpContainer->Release();
if(FAILED(hr))
return hr;

IWebBrowser2* lpWebBrowser;
hr = lpServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void**)&lpWebBrowser);
lpServiceProvider->Release();
if(FAILED(hr))
return hr;

hr = lpWebBrowser->get_LocationURL(strURL);
if (FAILED(hr))
return hr;

lpWebBrowser->Release();

return hr;
}
蒋晟 2005-06-24
  • 打赏
  • 举报
回复
你应该访问控件的容器。容器(在你描述的情况下是HTML文档对象)的IOleClientSite接口会传递给你实现的IOleObject::SetClientSite。之后你可以在需要的时候查询容器的IHTMLDocument2接口来访问HTML文档对象。通过IE的文档对象模型,你可以访问和控制网页元素和浏览器,例如动态修改所在网页、控制浏览器的状态栏等等。文档所属的浏览器或者内嵌框架的IWebBrowser2接口可以通过查询文档的IServiceProvider接口,以及查询SID_SWebBrowserApp服务来获得。顶层浏览器对象可以通过查询文档的IServiceProvider接口,以及查询SID_STopLevelBrowser服务来获得。
shines77 2005-06-23
  • 打赏
  • 举报
回复
自己up

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧