2014-03-30 95 views
2

當創建通過ATL一個COM對象,默認.RGS文件始終註冊對象HKCR:如果該對象被寫入到註冊表的第一爲什麼ATL COM註冊默認爲HKCR

HKCR 
{ 
... 
} 

時間寫入HKCR相當於寫給HKLM,這會使所有用戶都可以看到全局對象。

  1. 這似乎是從自HKCR/HKLM註冊表維護站立點相當貧窮的想法將很快由機器上的任何用戶,從而放慢訪問的所有用戶安裝的任何COM對象炸燬。此外,包含COM對象的任何部署模塊都必須在UAC上請求Windows上的管理員提升,這會對可部署性產生不利影響。那麼爲什麼ATL/COM這樣設計?

  2. 本文建議爲了在HKCU(http://blogs.msdn.com/b/jaredpar/archive/2005/05/29/423000.aspx)下注冊COM對象,必須更新DllRegisterServer。如果我們只是在.rgs文件中將HKCR更改爲HKCU,爲什麼它不起作用? ATL會忽略它嗎?如果是這樣的話,爲什麼它堅持使用HKCR?

回答

3

通過DllRegisterServer註冊可望通過設計提供系統範圍註冊和COM類可用性。

要取代此註冊行爲並註冊每個用戶,在某些時候引入了另一種註冊方法:DllInstall函數。目前的ATL實現了這個開箱即用的功能,通過提供給用戶的「用戶」命令行開關,提供每用戶註冊的DllInstall功能。

下面是(使用嚮導)從模板生成新的項目,你有代碼:

// DllInstall - Adds/Removes entries to the system registry per user per machine. 
STDAPI DllInstall(BOOL bInstall, _In_opt_ LPCWSTR pszCmdLine) 
{ 
    HRESULT hr = E_FAIL; 
    static const wchar_t szUserSwitch[] = L"user"; 
    if (pszCmdLine != NULL) 
    { 
     if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0) 
     { 
      ATL::AtlSetPerUserRegistration(true); 
     } 
    } 
    if (bInstall) 
    { 
     hr = DllRegisterServer(); 
     if (FAILED(hr)) 
     { 
      DllUnregisterServer(); 
     } 
    } 
    else 
    { 
     hr = DllUnregisterServer(); 
    } 
    return hr; 
} 

要登記每個用戶可以用「REGSVR32 /我:用戶MyAtlProject.dll」。你可以自由選擇你想要的註冊,沒有「差」和「好」的方法 - 你只有選擇可供選擇。