时间: 2021-07-31 作者:daque
ie里的探究之定制欣赏器好帮忙(中)(作家:青苹果处事室编写翻译 2001年02月08日 14:00)检验和测定挪用者 像前方提到的,即使你运转的外壳本子不低于471,bho 就既能被internet explorer又能被windows explorer援用。在这个例子里,咱们假如波及一个专对 html 页面起效率的帮忙东西,以是它该当对 windows explorer 不起任何效率。一个不想被一定的挪用者加载的 dll 不妨在它创造谁是挪用者后,大略地在它的 dllmain() 因变量中归来 false。当你将 null 动作 api 因变量 getmodulefilename() 的第一个参数挪用它时,它归来挪用 dll 的模块名。这个参数是你想领会名字的模块的句柄。null 表白你想领会挪用 dll 的过程的名字。 if (dwreason == dll_process_attach) { tchar pszloader[max_path]; getmodulefilename(null, pszloader, max_path); _tcslwr(pszloader); if (_tcsstr(pszloader, _t("explorer.exe"))) return false; } 你领会了过程的名字,你就能在它是 windows explorer 时退出加载进程。提防采用更庄重的减少是很伤害的。本质上,其它过程大概视为一个平常的因为挪用它但被中断。第一个被害者是 regsvr32.exe,这个步调用来机动备案东西。即使 你是用各别的尝试前提,比方说,只承诺 internet explorer 不妨实行: if (!_tcsstr(pszloader, _t("iexplore.exe"))) 你就不许备案 dll 了。本质上,当 regsvr32.exe 试图加载 dll 以挪用dllregisterserver() 因变量时,挪用被中断。 同 webbrowser 创造接洽 setsite() 本领是 bho 举行初始化以及一切只举行一次工作的场合。当你用 internet explorer 欣赏 url 时,你须要等候一对事变以保证所需的文书档案被实足载入并被初始化。惟有在这一场所上你能经过大概生存的东西模子安定地考察它的 实质。这表白你须要赢得一对南针。第一个是指向 iwebbrowser2 的,它是处置 webbrowser 东西的接口。第二个南针和事变相关。这个模块必需备案为欣赏器的事变监听者,再不不妨接受对于载入和文书档案关系事变的报告。经过运用 atl 的精致南针: ccomqiptr<iwebbrowser2, &iid_iwebbrowser2> m_spwebbrowser2; ccomqiptr<iconnectionpointcontainer, &iid_iconnectionpointcontainer> m_spcpc; 源代码一致于: hresult cviewsource::setsite(iunknown *punksite) { // 赢得并生存 iwebbrowser2 南针 m_spwebbrowser2 = punksite; if (m_spwebbrowser2 == null) return e_invalidarg; // 赢得并生存 iconnectionpointercontainer 南针 m_spcpc = m_spwebbrowser2; if (m_spcpc == null) return e_pointer; // 赢得并生存欣赏器的 hwnd。其余为此后的运用安置键盘挂钩。 retrievebrowserwindow(); // 贯穿到容器以接收事变报告 return connect(); } 要赢得指向 iwebbrowser2 接口的南针,你只须要大略地查问。对事变处置的第一个办法,赢得 iconnectionpointcontainer 的南针,也用同样的方法。setsite() 的代码也查问欣赏器的 hwnd 并在当火线程上安置键盘挂钩。hwnd 此后会被用以挪动 internet explorer 窗口并变换它的尺寸。谁人挂钩,被用以供给一个热键,以简单用户表露或湮没 html 代码窗口。