【发布时间】:2016-11-18 07:14:15
【问题描述】:
乡亲
我正在将旧版应用程序从 VS2008 升级到 VS2015。它非常依赖 ATL 和 COM。我注意到 atlbase.h 中 _ATL_COM_MODULE70 的变化导致了问题。
在 ...\9.0\VC\atlmfc\include\atlbase.h 中定义为:
struct _ATL_COM_MODULE70
{
UINT cbSize;
HINSTANCE m_hInstTypeLib;
_ATL_OBJMAP_ENTRY** m_ppAutoObjMapFirst;
_ATL_OBJMAP_ENTRY** m_ppAutoObjMapLast;
CComCriticalSection m_csObjMap;
};
但是在 ...\14.0\VC\atlmfc\include\atlcom.h 中它被定义为:
struct _ATL_COM_MODULE70
{
UINT cbSize;
HINSTANCE m_hInstTypeLib;
_ATL_OBJMAP_ENTRY_EX** m_ppAutoObjMapFirst;
_ATL_OBJMAP_ENTRY_EX** m_ppAutoObjMapLast;
CComCriticalSection m_csObjMap;
};
这会导致以下代码无法编译:
HRESULT FreeThreadSingletons (void)
{
for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
{
if (*ppEntry != NULL)
{
_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
CComClassFactoryThreadSingleton *pThread;
if ((pThread = dynamic_cast<CComClassFactoryThreadSingleton *>(pEntry->pCF)) != NULL)
{
pThread->ReleaseAllObjects ();
}
}
}
return S_OK;
}
原因是因为 m_ppAutoObjMapFirst 在 VC14 中是 _ATL_OBJMAP_ENTRY_EX 类型,在 VC9 中是 _ATL_OBJMAP_ENTRY 类型。
Microsoft 的 VS2015 文档说 VC14 中的结构应该与 VC9 中的相同: https://msdn.microsoft.com/en-us/library/ayw1b6h5.aspx
现在回答问题。过去有没有人见过这个问题,是否有不涉及将所有内容重写到 _ATL_OBJMAP_ENTRY_EX 接口的解决方法?
【问题讨论】:
-
"documentation... 说结构应该是相同的"实际上并非如此,因此您只需要分别更新
FreeThreadSingletons,以反映_ATL_OBJMAP_ENTRY与_ATL_OBJMAP_ENTRY_EX的变化。