HelloWorld.cpp
加载 DLL 后,系统将通过 DLL_PROCESS_ATTACH 通知调用 DllMain 函数。由于 Internet Explorer 大量使用多线程,因此,对 DllMain 的频繁的 DLL_THREAD_ATTACH 和 DLL_THREAD_DETACH 通知会降低扩展和浏览器进程的整体性能。既然该 BHO 不需要线程级的跟踪,我们可以在 DLL_PROCESS_ATTACH 通知期间调用 DisableThreadLibraryCalls 以避免新线程通知的额外开销。
在 HelloWorld.cpp 中,如下编写 DllMain 函数的代码:
| 以下是引用片段: extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hInstance); } return _AtlModule.DllMain(dwReason, lpReserved); } |
注册 BHO
剩下要做的只是将 BHO 的 CLSID 添加到注册表中。此条目会将 DLL 标记为浏览器帮助程序对象,并使 Internet Explorer 在启动时加载 BHO。Visual Studio 可在生成项目时注册 CLSID。
注意 在 Windows Vista 上,Visual Studio 需要提升的特权才能与注册表进行交互。请确保通过在“开始”菜单中右键单击 Microsoft Visual Studio 2005 并选择“以管理员身份运行”来启动开发环境。
此 BHO 的 CLSID 可在 HelloWorld.idl 中找到(位于如下所示的代码块中):
| 以下是引用片段: importlib("stdole2.tlb"); [ uuid(D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77), helpstring("HelloWorldBHO Class") ] |
请注意,此文件包含三个 GUID;我们需要的是用于类的 CLSID,而不是用于库的 CLSID 或接口 ID。
创建自行注册的 BHO:
1.从 Visual Studio 中的“解决方案资源管理器”打开 HelloWorld.rgs。
2.将以下代码添加到文件末尾:
| 以下是引用片段: HKLM { NoRemove SOFTWARE { NoRemove Microsoft { NoRemove Windows { NoRemove CurrentVersion { NoRemove Explorer { NoRemove '浏览器帮助程序对象' { ForceRemove '{D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77}' = s 'HelloWorldBHO' { val 'NoExplorer' = d '1' } } } } } } } } |

