由于某种人力不可抗拒的无法告知的一些事件,最近偶过的不是很爽,发文小纪念一下. 大家都知道,使用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;
}