我寫了一個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.¢%