我有一个我不明白的编译错误。我有两个使用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