共用方式為


Self-Registration

隨著元件軟體隨著市場持續成長,使用者會以單一 DLL 或 EXE 模組的形式取得新的軟體元件,例如從在線服務下載新元件,或從軟盤上的朋友那裡接收新元件時,會有越來越多的實例。 在這些情況下,要求使用者經歷冗長的安裝程式或安裝程式並不實用。 除了透過 IClassFactory2處理的授權問題之外,安裝程式通常會建立元件在 COM 和 OLE 內容中正常執行的必要登錄專案。

自我註冊是一種標準方式,伺服器模組可以透過此方式將自己的登錄作業封裝到模組本身,包括註冊和取消註冊。 搭配透過 IClassFactory2處理的授權使用時,伺服器可能會成為完全獨立的模組,不需要外部安裝程式或.reg檔案。

任何自我註冊模組 DLL 或 EXE 都應該先在其版本資訊資源的 StringFileInfo 區段中包含 “OleSelfRegister” 字串,如下所示。

VS_VERSION_INFO VERSIONINFO 
 
 ... 
 
 BEGIN 
   BLOCK "StringFileInfo" 
    BEGIN 
#ifdef UNICODE 
     BLOCK "040904B0" // Lang=US English, CharSet=Unicode 
#else 
     BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilingual 
#endif 
      BEGIN 
       ... 
       VALUE "OLESelfRegister", "\0" 
      END 
 
   ... 
 
   END 
 
 ... 
 
 END 
 

此數據的存在可讓任何感興趣的物件,例如想要整合這個新元件的應用程式,判斷伺服器是否支援自我註冊,而不需要先載入 DLL 或 EXE。

如果伺服器封裝在 DLL 模組中,DLL 必須匯出 DllRegisterServer 的函式,DllUnregisterServer。 任何想要指示伺服器自行註冊的應用程式(亦即其所有 CLSID 和類型連結庫標識碼)都可以透過 getProcAddress 函式,取得 DllRegisterServer 指標。 在 DllRegisterServer中,DLL 會建立所有必要的登錄專案,針對所有 InprocServer32InprocHandler32 專案儲存 DLL 的正確路徑。

當應用程式想要從系統移除元件時,應該呼叫 DllUnregisterServer來取消註冊該元件。 在這裡呼叫中,伺服器會完全移除先前在 dllRegisterServer 中建立的專案,。 伺服器不應該盲目移除其類別的所有專案,因為其他軟體可能已儲存其他專案,例如 TreatAs 密鑰。

如果伺服器封裝在 EXE 模組中,希望註冊伺服器的應用程式會使用命令行自變數啟動 EXE 伺服器,/RegServer-RegServer (不區分大小寫)。 如果應用程式想要取消註冊伺服器,它會使用命令行自變數啟動 EXE /UnregServer-UnregServer。 自我登錄 EXE 會偵測這些命令行自變數,並叫用與 DLL 相同的作業,在 DllRegisterServerDllUnregisterServer中,分別在 LocalServer32 下註冊其模組路徑,而不是 InprocServer32InprocHandler32

伺服器必須為其各自的 InprocServer32InprocHandler32註冊 DLL 或 EXE 模組安裝位置的完整路徑,並在登錄中 LocalServer32 機碼。 模組路徑可透過 getModuleFileName函式輕鬆取得

安裝即服務應用程式

在安裝 註冊類別

註冊執行中的EXE Server

在 ROT 中註冊物件