共用方式為


自我註冊

隨著元件軟體隨著市場持續成長,使用者會以單一 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 必須匯出 DllRegisterServerDllUnregisterServer 函式。 任何想要指示伺服器自行註冊的應用程式(也就是其所有 CLSID 和類型連結庫標識碼)都可以透過 GetProcAddress 函式取得 DllRegisterServer 的指標。DllRegisterServer 中,DLL 會建立所有必要的登錄專案,並儲存所有 InprocServer32 或 InprocHandler32 專案之 DLL 的正確路徑。

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

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

伺服器必須針對登錄中的個別 InprocServer32、InprocHandler32LocalServer32 機碼,註冊 DLL 或 EXE 模組安裝位置的完整路徑。 模組路徑可透過 GetModuleFileName 函式輕鬆取得

安裝即服務應用程式

在安裝時註冊類別

註冊執行中的 EXE 伺服器

在 ROT 中註冊物件