一分钟学会手工注册BHO

      由于某种人力不可抗拒的无法告知的一些事件,最近偶过的不是很爽,发文小纪念一下. 大家都知道,使用ATL的向导即可迅速生成一个最简单的IE辅助插件(BHO)。而IE启动的时候是通过注册表项寻找BHO并实例化BHO对象的。那么ATL工程的DllRegisterServer(void)究竟做了些什么写注册表的工作呢。其实不复杂,我们可以手工注册一个BHO模拟出来。嗯,闲话少说,翠花,上代码

bool ManualRegBHO(char * szClSID, char * szLIBID, char * szDesc, char * szProgName, char * szCurVersion, char * szProgpath)
{
 char szPath[MAX_PATH];
 sprintf(szPath, "CLSID//%s", szClSID);

 CRegKey cKey;
 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szPath))
  return false;
 cKey.SetValue(szDesc);
 cKey.Close();

 sprintf(szPath, "CLSID//%s//InprocServer32", szClSID);
 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szPath))
  return false;
 cKey.SetValue(szProgpath);
 cKey.SetValue("Apartment", "ThreadingModel");
 cKey.Close();

 sprintf(szPath, "CLSID//%s//ProgID", szClSID);
 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szPath))
  return false;
 cKey.SetValue(szCurVersion);
 cKey.Close();

 sprintf(szPath, "CLSID//%s//Programmable", szClSID);
 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szPath))
  return false;
 cKey.Close();

 sprintf(szPath, "CLSID//%s//TypeLib", szClSID);
 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szPath))
  return false;
 cKey.SetValue(szLIBID);
 cKey.Close();

 sprintf(szPath, "CLSID//%s//VersionIndependentProgID", szClSID);
 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szPath))
  return false;
 cKey.SetValue(szProgName);
 cKey.Close();

 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szCurVersion))
  return false;
 cKey.SetValue(szDesc);
 cKey.SetValue(szClSID, "CLSID");
 cKey.Close();

 if(ERROR_SUCCESS != cKey.Create(HKEY_CLASSES_ROOT, szProgName))
  return false;
 cKey.SetValue(szDesc);
 cKey.SetValue(szClSID, "CLSID");
 cKey.SetValue(szCurVersion, "CurVer");
 cKey.Close();

 char szBHOPath[1024];
 sprintf(szBHOPath, "Software//Microsoft//Windows//CurrentVersion//Explorer//Browser Helper Objects//%s", szClSID);
 if(ERROR_SUCCESS != cKey.Create(HKEY_LOCAL_MACHINE, szBHOPath))
  return false;
 cKey.Close();

 return true;
}

怎么测试上面这个函数呢,很简单,假设现在有了一个BHO的dll,叫做RegBHOTest。

#include <windows.h>
#include <stdio.h>
#include <atlbase.h>

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

bool ManualRegBHO(char * szClSID, char * szLIBID, char * szDesc, char * szProgName, char * szCurVersion, char * szProgpath);

int main(int argc, char argv[])
{
 char szClSID[MAX_PATH];
 sprintf(szClSID, "{1F91A9A1-01BA-4c81-863D-3BA0751E1419}");
 char szLIBID[MAX_PATH];
 sprintf(szLIBID, "{7AF35383-BF85-4c9a-85A0-89F052D76787}");
 char szDesc[MAX_PATH];
 sprintf(szDesc, "RegBHOTest Class");
 char szProgName[MAX_PATH];
 sprintf(szProgName, "RegBHO.RegBHOTest");
 char szCurVersion[MAX_PATH];
 sprintf(szCurVersion, "RegBHO.RegBHOTest.1");
 char szProgpath[MAX_PATH];
 sprintf(szProgpath, "C://Windows//System32//RegBHOTest.dll");

 printf("BHO Info:/nCLSID: %s/nLIBID: %s/nDesc: %s/nProgName: %s/nCurVersion: %s/nProgPath: %s/n",
  szClSID, szLIBID, szDesc, szProgName, szCurVersion, szProgpath);

 if(ManualRegBHO(szClSID, szLIBID, szDesc, szProgName, szCurVersion, szProgpath))
 {
  printf("BHO注册成功!/n");
 }
 else
 {
  printf("BHO注册失败!/n");
 }
 return 0;
}

你可能感兴趣的:(工作,IE,测试,Class,dll,Path)