Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么ATL COM注册默认为HKCR_Com_Registry_Uac_Atl - Fatal编程技术网

为什么ATL COM注册默认为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是这样设

通过ATL创建COM对象时,默认的.rgs文件始终将对象注册到HKCR:

HKCR
{
...
}
如果此对象是首次写入注册表,则写入HKCR相当于写入HKLM,这将使对象对所有用户全局可见

  • 从注册表维护的角度来看,这似乎是一个相当糟糕的想法,因为HKCR/HKLM会随着任何用户在机器上安装的任何COM对象而迅速崩溃,从而降低所有用户的访问速度。此外,包括COM对象在内的任何部署模块都必须在使用UAC的Windows上请求管理员提升,这将对部署能力产生不利影响。那么为什么ATL/COM是这样设计的呢

  • 本文建议,为了在HKCU()下注册COM对象,必须更新DllRegisterServer。如果我们只是在.rgs文件中将HKCR更改为HKCU,为什么不起作用?ATL会忽略它吗?如果是这样,为何要坚持使用香港华润


  • 通过
    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”。你可以自由选择你想要的注册,没有“差”和“好”的方法-你只有选择