BHO 개체는 레지스트리에 등록이 되면, 이후로 탐색기와 인터넷 익스플로러가 실행될 때마다 해당 프로그램의 프로세스 공간으로 로딩이 됩니다.
즉, 잠겨지게 되는 것이죠.
대부분의 경우, BHO 개발동기는 Internet Explorer 에 Plug-in 시키기 위해서인데, 쓸데없이 탐색기에 떠서 말썽이 일어나거나, 탐색기로 인해 컴파일이 안되어서 폴더확장까지 다 해놓은 탐색기를 종료시켜야 하는 상황이 발생합니다.
잠깐 머리를 써보았더니, 해답은 생각보다 간단하더군요.
다음과 같이 구현을 해놓으시면 됩니다.
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
char tempBuf[ 4096 ] = { 0 };
::GetModuleFileName( NULL, tempBuf, 4096 );
if ( CStringEx::ciFind( tempBuf, "explorer.exe" ) != -1 )
{
// 인터넷 익스플로러가 아닌 탐색기에서 활성화 되는 것이라면.
// FALSE 를 반환.
return FALSE;
}
_Module.Init(ObjectMap, hInstance, &LIBID_IEXTENDER3Lib);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}