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
Copyright © 2000-2016 粤ICP05021785号
地址:广州市天河区员村二横路8号全丰商业大厦808室 邮编:510600