2012-11-16 38 views
0

試圖追查一個COM問題,我調試我的代碼,並似乎看到相同的GUID來表示不同的方式...GUID/PROGID/CLSID混亂

我有一條線在我們的代碼: class __declspec(uuid("{D4F83347-E58E-11d1-9D47-006008098294}"))

以及各種在呼叫之間,然後到註冊表的東西:

CLSID clsid; 
::CLSIDFromProgID("myProgId",&clsid); 

在調試器,CLSID顯示爲{000AFC9A-3347-D4F8-8EE5-D1119D470060}。對我來說這太類似了,不太對,但這不是我可以自動檢查的東西...我們有D4F8和3347,9D47,但E58E變成8EE5等。

有沒有我能理解的方法爲什麼會發生這種情況,還有一種方法可以讓他們看起來相同?

編輯 澄清一些邊跟蹤,我檢查,並在Windows註冊表中和我們的註冊腳本CLSID是作爲{D4F83347-E58E-11d1-9D47-006008098294} - 所以在我的uuid(...)的問題是不相關的,我認爲。

回答

0

經過一些測試後,我發現問題只是如何Visual C++調試器只顯示該值,例如註冊表值爲{D4F83347-E58E-11d1-9D47-006008098294},調用::StringToCLSID()CLSIDFromProgID()的結果給出{D4F83347-E58E-11d1-9D47-006008098294} - 但在調試器MSVC++ 顯示變量爲{000AFC9A-3347-D4F8-8EE5-D1119D470060}

爲什麼它這樣做,是另一個問題!

1

當你已經有了guid的時候使用CLSIDFromProgID()沒什麼意義。該函數在註冊表中查找將「ProgId」字符串映射到CLSID {guid}。當然,重要的是progid是正確註冊的。當然聽起來不是這樣。當你的班級已經用__declspec(uuid)進行裝飾時,只需使用__uuidof() operator來檢索指導。

字節值的相似性表明您的註冊碼已損壞。

+0

這也是我們如何在我們的reg-scripts中展示它的。例如我檢查了註冊表和'HKEY_CLASSES_ROOT \ myProgId \ CLSID = {D4F83347-E58E-11d1-9D47-006008098294}',即我從我的代碼發佈的相同格式。那麼它似乎是正確的,但是然後以其他格式返回。僅供參考,我們使用progIds作爲字符串來動態加載東西,但它是一個很大的舊客戶端 - 服務器系統,其歷史遺失了起源:) –

+0

好吧,只需使用Regedit.exe查看並檢查寫入的實際值即可。如果它不匹配,那麼要麼忘記重新註冊DLL,要麼必須調試註冊碼。 –

+0

根據我之前的評論,來自regedit的_IS_。這是我們使用_everyehere_的格式,而MSVC++調試器以這種其他格式顯示'CLSIDFromProgID()'的結果。其實 - 這可能只是一個調試問題,它如何呈現GUIDS? –

1

「__declspec(uuid」只是標識符與你的類的關聯,沒有別的。使用CLSIDFromProgID API,你需要在系統註冊表中使用註冊信息來解析ProgID到CLSID。也就是說,兩者不必匹配它們通常會匹配,但是如果你做的一切都很整潔,並且你的COM類註冊時使用的是與C++類源代碼中附加的標識符相同的標識符