之前只是有零散的概念寿冕,這次把這些信息都組織起來蕊程,備忘。
COM組件注冊的時候驼唱,會往注冊表中寫入下面這幾類信息:
- Interface
- Class
- Type Library
- AppID
- ProgID
因?yàn)镠KEY_CLASSES_ROOT\下的鍵是從HKLM_Software\Classes\映射過去的藻茂,所以這兩個地方都能找到(如果是32位組件的話,就要多一級WOW6432Node)
Interface
接口的信息會寫入到HKEY_CLASSES_ROOT\Interface{Interface GUID}中
一般有兩個子key:ProxyStubClsid32和TypeLib
看名知其意,這兩個子key就是代理dll和類型庫的信息
Class
COM類的信息會寫入到HKEY_CLASSES_ROOT\CLSID{Class GUID}
這里寫入的是關(guān)鍵信息捌治,有下面幾個子key:
- InprocServer32 (dll的路徑和線程模型岗钩,如果是server的話,這里為LocalServer32)
- ProgID (字符串形式的接口名肖油,方便JS這樣的腳本使用,免得使用GUID這樣的形式)
- TypeLib (類型庫)
- VersionIndependentProgID (版本無關(guān)的接口名)
- Programmable
TypeLibrary
類型庫的信息會寫入到HKEY_CLASSES_ROOT\TypeLib{TypeLib GUID}
這里寫入的是對應(yīng)的組件dll路徑
這里有個疑惑臂港,構(gòu)建時生成的tlb信息是放到注冊表中還是dll的資源段森枪,像js、vb等腳本語言是如何找到并加載這些類型庫信息的审孽?
AppID
注冊表寫入位置:HKEY_CLASSES_ROOT\AppID{組件文件名|{AppID GUID}}
寫入內(nèi)容:AppID的GUID县袱,GUID對應(yīng)的AppID,這個GUID好像是自動生成的佑力,一般用不到
ProgID
注冊表寫入位置:HKEY_CLASSES_ROOT{帶版本號和不帶版本號的ProgID}
寫入內(nèi)容:對應(yīng)的CLSID