我写了一个ocx,运行在网页内, 想在ocx中获取当前网页的URL地址,代码在网上找到了, 也能用,但是发现有个问题,在网页中用<object.../>和new ActiveXObject() 两种方式 载入ocx是,后种方式总是出错,请高手指点一下,不胜感激! 附代码(BCB的代码,AnsiString可看作VC的CString): ... AnsiString __fastcall TMyOcxImpl::GetPageURL(void) { AnsiString s(""); try { CComPtr<IOleContainer> iOct; OleCheck(m_spClientSite->GetContainer(&iOct)); CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> iDoc(iOct); if(iDoc!=NULL) { CComBSTR url(""); OleCheck(iDoc->get_URL(&url)); s=AnsiString(url.Copy()); } } catch(...) { s=""; } return s; } 问题点数:100、回复次数:9Top
主要是这一句: OleCheck(m_spClientSite->GetContainer(&iOct)); 在Debug模式下会在 atlbase.h 内产生一个断言失败。Top
ActiveX created by using <object> is hosted by the DHTML Document object, which may supports IHTMLDocument2. ActiveX created by using new ActiveXObject is hosted by the script engine. Top
蒋老大你好: 为什么 new ActiveXObject("Microsoft.XMLHttpRequest") 可以send时可以使用相对路径呢? 我的ocx内部在<object.../>情况时,自动获取当前网页的URL,然后通过UrlCombine()来转化的,不知道XMLHttpRequest如何弄的。Top
uppp...Top
因为URL是一样的……Top
因为URL是一样的…… ------------------------- 哪个跟哪个一样啊?不明白。 页面当前完整URL是 http://aaa.bbb.ccc/ddd/eee/fff.jsp 用: var xobj=new ActiveXObject("Microsoft.XMLHttpRequest") ; xobj.send("../a.jsp"); 能正确的访问到 http://aaa.bbb.ccc/ddd/eee/a.jsp 用: var myobj=new ActiveXObject("Myy.MyOcx") ; myobj.HttpGet("../a.jsp"); 因为myobj不能自动获取到页面当前完整URL,内部不能用 UrlCombine()来合成 “http://aaa.bbb.ccc/ddd/eee/fff.jsp”和 “../a.jsp” 到 “http://aaa.bbb.ccc/ddd/eee/a.jsp” 除非我改方法,加个参数: myobj.HttpGet(window.location.href,"../a.jsp"); 但这样使用起来比较不方便啊。Top
蒋老大: 还记得这个问题吗? “如何通过载入的ActiveX来在当前IE进程中创建一个自定义行为的“永久性”线程?” http://community.csdn.net/Expert/topic/4130/4130296.xml?temp=.5653192 我后来终于找到了解决的办法,其实很简单,ocx 的主文件中有这个输出函数: STDAPI __export DllCanUnloadNow(void) { //return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; return S_FALSE; // 为心跳线程,我野蛮地阻止了IE进程卸载我的OCX } 总是返回 S_FALSE 这样就OK了。 谢谢您在回复中给了我一些提示。Top
surely you can pass the url or even the HTML window object (external.menuArguments) to the activex control, but you may also implement IObjectWithSite to get the IWebBrowser2 interface. If your control supports this interface, Internet Explorer will call the SetSite method with a pointer, which may be used to query the webbrowser service via its IServiceProvider interface.Top
呵呵,搞定了!就是通过实现IObjectWithSite接口做的,不过 <object.../>和new ActiveXObject() 两种方式得分别用不同的方法 前者是: 从 m_spClientSite!=NULL, 得到 IOleContainer ... 后者是: 从 m_spUnkSite!=NULL , 得到 IServiceProvider ,再QueryService到IWebBrowser2...
Powered by: C++博客 Copyright © S.l.e!ep.¢%