手头正在开发的一个COM是用纯C++写的,所以在DllRegisterServer注册的时候都是自行写入注册表。
当我切换到其他程序测试COM时发现CLSIDFromProgID并不能获取到CLSID。
折腾了一下后才发现我对CLSIDFromProgID这个函数有点小小的误解。
之前一直以为这个函数是从CLSID子键下面去查找的。
HKEY_CLASSES_ROOT\CLSID\{1CA945EA-978B-4012-9443-A1A3EA823EA4}
其实它是在HKEY_CLASSES_ROOT根键下查询的
// 实际是从 HKEY_CLASSES_ROOT\AAA.BBB\CLSID 处获取到CLSID CLSIDFromProgID("AAA.BBB", &clsid);
相反的,ProgIDFromCLSID才是从CLSID子键下去处获取ProgID。
HKEY_CLASSES_ROOT\CLSID\{1CA945EA-978B-4012-9443-A1A3EA823EA4}\ProgID
大部分人都是用类似ATL的框架去开发COM,注册过程都由框架或工具自动完成了,所以大家可能都没了解到这些细节。