ATL 开发不注册即可调用的COM
(创建时间:2014年08月10日 09:44:19)
Jangogo : 



用VB6生成的COM, 可以不通过注册即可调用(使用DirectCOM.dll).
但是通过ATL编出来的COM,调用失败,具体表现是: GETINSTANCE是成功的,invoke任何属性和方法都失败.
ATL封装了invoke, 一下子搞不清是什么问题. 跟踪代码发现,
inline HRESULT CComTypeInfoHolder::GetTI(LCID lcid) 里面
调用了LoadRegTypeLib.  应该调用 LoadTypeLib才对.
这个GETTI 做了一个分支判断
if (InlineIsEqualGUID(CAtlModule::m_libid, *m_plibid) && m_wMajor == 0xFFFF && m_wMinor == 0xFFFF)
则调用 LoadTypeLib
否则调用 LoadRegTypeLib , 猜想这样做应该了为了避免COM组件的版本冲突.

解决方法: 在ATL每个COM的定义中

class ATL_NO_VTABLE Cxxxxx :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<Cxxxxx, &CLSID_xxxxx>,
public IDispatchImpl<Ixxxxx, &IID_Ixxxxx, &LIBID_xxxxxLib, /*wMajor =*/ 1, /*wMinor =*/ 0>


把两个版本号都改成 0xFFFF 即可:
public IDispatchImpl<Ixxxxx, &IID_Ixxxxx, &LIBID_xxxxxLib, /*wMajor =*/ 0xFFFF, /*wMinor =*/ 0xFFFF>
c++com