2011-04-20 147 views
6

我正在創建一個COM服務器可執行文件,並遇到類註冊的問題。當我創建我的類對象時,自動生成的.rgs文件如下所示:ATL COM類註冊.rgs文件默認

HKCR 
{ 
    NoRemove CLSID 
    { 
     ForceRemove {4C6DAD45-64B4-4C55-81C6-4CE125226421} = s 'Test Class' 
     { 
      ForceRemove Programmable 
      LocalServer32 = s '%MODULE%' 
      { 
       val ServerExecutable = s '%MODULE_RAW%' 
      } 
      TypeLib = s '{EAA173CA-BDBC-463A-8B7A-B010EFA467BC}' 
      Version = s '1.0' 
     } 
    } 
} 

這爲CLSID創建了正確的註冊表項。但是,當嘗試從外部調用CoCreateInstance時,我遇到了掛起。

hr = CoCreateInstance(__uuidof(Test), NULL, CLSCTX_ALL, __uuidof(ITest), (void**)&pTest); 

看着其他幾個項目的例子之後,我發現他們都有類型的註冊表項:

HKEY_CLASSES_ROOT\<MODULE>.<CLASS> 
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>\CLSID 

我調查了.RGS文件,這些類,並注意到他們有額外的條目不存在於我的.rgs文件中。我將他們添加到礦山,將其更改爲:

HKCR 
{ 
    TestModule.Test = s 'Test Class' 
    { 
     CLSID = s '{4C6DAD45-64B4-4C55-81C6-4CE125226421}' 
    } 

    NoRemove CLSID 
    { 
     ForceRemove {4C6DAD45-64B4-4C55-81C6-4CE125226421} = s 'Test Class' 
     { 
      ForceRemove Programmable 
      LocalServer32 = s '%MODULE%' 
      { 
       val ServerExecutable = s '%MODULE_RAW%' 
      } 
      TypeLib = s '{EAA173CA-BDBC-463A-8B7A-B010EFA467BC}' 
      Version = s '1.0' 
     } 
    } 
} 

你瞧,我的CoCreateInstance調用不再就掛了,我能夠正確地檢索指向一個ITest接口。

現在,我的問題是,鑑於上述細節,我如何確保我創建的任何未來類都具有正確的.rgs文件格式?在創建類對象時是否存在某些選項?或者我是否需要爲每個創建的課程手動添加上述內容?

我正在使用Visual Studio 2010.

回答

6

這就是coclass的ProgID。它主要由腳本語言使用,即使用後期綁定的腳本語言。 CreateObject()是通常的函數名稱。這與懸掛有什麼關係是無法解釋的,你最好調試它。

.rgs條目由ATL嚮導自動生成。 ProgID編輯框是右下角的編輯框。它不像其他人那樣自動填充,你可能錯過了它。

+0

感謝您的答覆,解釋和解決方案。 – 2011-04-20 23:52:23

1

對不起,五年後... 我遇到了類似的問題,使用Visual Studio 2015專業ATL COM嚮導。 (錯誤0x80080005 - 服務器執行失敗) 它看起來像ATL COM嚮導中的錯誤(因爲一些VS版本,並且仍未在最新的VS2015中進行更正)。

我發現這個MS頁面上的手動校正答案: https://connect.microsoft.com/VisualStudio/feedback/details/782281/catlservicemodulet-not-registering-components

的.RGS文件沒有嚮導完全充滿。 希望這有助於。