我有一个我不明白的编译错误。我有两个使用WLT 8.0的C ++项目。我正在使用VS2005进行编译。一种在Win XP或7上运行,另一种在CE上运行。它们都包含WLT 8.0标头。

但是在为CE项目进行编译时,出现以下错误:

Error 104 error C2084: function 'HRESULT ATL::CComModule::RegisterClassObjects(DWORD,DWORD) throw()' already has a body C:\WTL80\include\atlapp.h 150


此错误的来源在这里:

namespace ATL
{
  inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw()
  { return E_NOTIMPL; }
  inline HRESULT CComModule::RevokeClassObjects() throw()
  { return E_NOTIMPL; }
}; // namespace ATL


我只能看到两个项目之间的不同之处是CE项目中的这些marcos:(_WIN32_WCE=$(CEVER);ARM;_ARM_;$(CePlatform);ARMV4I;UNDER_CE=$(CEVER);),并且我无法在CE项目中设置默认的调用约定__cdecl

任何有线索的人都会喜欢这种教育。

预先感谢。

最佳答案

这是由于WTL的atlapp.h与ATL的atlbase.h不兼容引起的。它只会在WinCE项目#ifdef _WIN32_WCE中发生。因此,我认为答案是注释掉损坏的WTL部分。

在atlapp.h中

// namespace ATL
// {
//   inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw()
//   { return E_NOTIMPL; }
//   inline HRESULT CComModule::RevokeClassObjects() throw()
//   { return E_NOTIMPL; }
// }; // namespace ATL


WTL的这一部分可能是对ATL早期版本的补充尝试,只是在ATL加速发展时才被删除。

-PaulH

10-04 19:46