为什么ATL COM注册默认为HKCR
通过ATL创建COM对象时,默认的.rgs文件始终将对象注册到HKCR:为什么ATL COM注册默认为HKCR,com,registry,uac,atl,Com,Registry,Uac,Atl,通过ATL创建COM对象时,默认的.rgs文件始终将对象注册到HKCR: HKCR { ... } 如果此对象是首次写入注册表,则写入HKCR相当于写入HKLM,这将使对象对所有用户全局可见 从注册表维护的角度来看,这似乎是一个相当糟糕的想法,因为HKCR/HKLM会随着任何用户在机器上安装的任何COM对象而迅速崩溃,从而降低所有用户的访问速度。此外,包括COM对象在内的任何部署模块都必须在使用UAC的Windows上请求管理员提升,这将对部署能力产生不利影响。那么为什么ATL/COM是这样设
HKCR
{
...
}
如果此对象是首次写入注册表,则写入HKCR相当于写入HKLM,这将使对象对所有用户全局可见
通过
DllRegisterServer
注册有望通过设计提供系统范围的注册和COM类可用性
为了取代这种注册行为并按用户注册,在某个时候引入了另一种注册方法:函数。当前ATL通过提供给DllInstall
功能的“user”命令行开关,实现了这一开箱即用的每用户注册服务
以下是从模板(使用向导)生成的新项目的代码:
//DllInstall-为每台计算机的每个用户向系统注册表添加/删除条目。
STDAPI DllInstall(BOOL bInstall,_In_opt_LPCWSTR pszCmdLine)
{
HRESULT hr=E_失败;
静态常量wchar_t szUserSwitch[]=L“user”;
if(pszCmdLine!=NULL)
{
如果(_wcsnicmp(pszCmdLine,szUserSwitch,_countof(szUserSwitch))==0)
{
ATL::AtlSetPerUserRegistration(true);
}
}
如果(宾斯塔尔)
{
hr=DllRegisterServer();
如果(失败(小时))
{
DllUnregisterServer();
}
}
其他的
{
hr=DllUnregisterServer();
}
返回人力资源;
}
要按用户注册,可以使用“regsvr32/i:user MyAtlProject.dll”。您可以自由选择所需的注册,没有“差”和“好”的方法-您可以从中进行选择。通过
DllRegisterServer注册预计将通过设计提供系统范围的注册和COM类可用性
为了取代这种注册行为并按用户注册,在某个时候引入了另一种注册方法:函数。当前ATL通过提供给DllInstall
功能的“user”命令行开关,实现了这一开箱即用的每用户注册服务
以下是从模板(使用向导)生成的新项目的代码:
//DllInstall-为每台计算机的每个用户向系统注册表添加/删除条目。
STDAPI DllInstall(BOOL bInstall,_In_opt_LPCWSTR pszCmdLine)
{
HRESULT hr=E_失败;
静态常量wchar_t szUserSwitch[]=L“user”;
if(pszCmdLine!=NULL)
{
如果(_wcsnicmp(pszCmdLine,szUserSwitch,_countof(szUserSwitch))==0)
{
ATL::AtlSetPerUserRegistration(true);
}
}
如果(宾斯塔尔)
{
hr=DllRegisterServer();
如果(失败(小时))
{
DllUnregisterServer();
}
}
其他的
{
hr=DllUnregisterServer();
}
返回人力资源;
}
要按用户注册,可以使用“regsvr32/i:user MyAtlProject.dll”。你可以自由选择你想要的注册,没有“差”和“好”的方法-你只有选择