转载一些wince常见错误及解决办法

Wince6.0SDK问题


最近要做Wince6.0下的数据库的东西,用VS2005装了WINCE6_CHS_SDK,但是建立智能设备的MFC工程以后就无法调试,报错如下。。。
1>C:\Program Files\Windows CE Tools\wce600\CHSINT SDK For WinCE 6.0\include\ARMV4I\malloc.h(45) : error C2143: syntax error : missing ',' before '*'
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\atlosapice.h(879) : warning C4996: 'wcsncpy' was declared deprecated
1>        c:\program files\windows ce tools\wce600\chsint sdk for wince 6.0\include\armv4i\stdlib.h(177) : see declaration of 'wcsncpy'
1>        Message: 'This function or variable may be unsafe. Consider using wcsncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\atlosapice.h(1075) : warning C4996: 'wcsncpy' was declared deprecated
1>        c:\program files\windows ce tools\wce600\chsint sdk for wince 6.0\include\armv4i\stdlib.h(177) : see declaration of 'wcsncpy'
1>        Message: 'This function or variable may be unsafe. Consider using wcsncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\atlosapice.h(1123) : warning C4996: 'wcsncpy' was declared deprecated
1>        c:\program files\windows ce tools\wce600\chsint sdk for wince 6.0\include\armv4i\stdlib.h(177) : see declaration of 'wcsncpy'
1>        Message: 'This function or variable may be unsafe. Consider using wcsncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\atltime.h(402) : error C3861: 'wcsftime': identifier not found
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\atltime.h(429) : error C3861: 'wcsftime': identifier not found
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\atlcomtime.h(367) : error C3861: 'wcsftime': identifier not found
搞的我很郁闷啊。。。完全不知道怎么回事。。。
 
 
 
 
1.在项目的stdafx.h中寻找#pragma once语句,在它的后面加入如下所示的宏定义 : #define _CRT_SECURE_NO_DEPRECATE 
2.在项目的stdafx.h中寻找#pragma once语句,在它的后面加入如下所示的编译控制语句 : #pragma warning(disable:4996)



Windows Mobile移植到WinCE碰到的问题  


1)注释“#define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA”

2)CreateMenuBar、AtlCreateMenuBar 无法使用,需使用SHCreateMenuBar

HWND CCWSmartClientDialog::CreateCECommandBar( HWND hWnd )
{
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize     = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = ID_TOOLBAR1;
mbi.hInstRes   = _Module.GetModuleInstance();
mbi.nBmpId     = 0;
mbi.cBmpImages = 0;

if (!SHCreateMenuBar(&mbi)) 
return NULL;

return mbi.hwndMB;
}

3)LoadImage函数装载图标无效。
实例句柄得用_tWinMain传递过来的,不用使用_Module.GetModuleInstance来获取,这两者得到的实例句柄不一样,原因我还没弄明白。
尝试解决办法:
1)我怀疑是因为我改了atlapp.h中关于 RegisterClassObjects部分导致的,但将另外一个 RegisterClassObjects定义屏蔽掉结果也是一样的,估计跟这个没有关系。
2)我跟踪了CComModule::m_hInst产生过程,但在CComModule::Init过程就跟不下去了,不知道ATL是怎么传递WinMain的hInstance到CAtlBaseModule类去的。
3)临时解决办法:在-tWinMain函数中,_Module.AppRun之前,将hInstance赋值给CComModule的资源句柄,这样在程序其它地方就可以将它当作实例句柄了。
  _Module.SetResourceInstance(hInstance);

4)COM模块编译时会报错,提示UpdateRegistry不是xx的成员:
1>d:\日程\today\wince projects\atltest\ATLCls.h(65) : error C2039: “UpdateRegistry”: 不是“CATLCls”的成员
1>        d:\日程\today\wince projects\atltest\ATLCls.h(28) : 参见“CATLCls”的声明
1>d:\日程\today\wince projects\atltest\ATLCls.h(65) : error C2065: “UpdateRegistry”: 未声明的标识符

解决办法:
   在COM类的头文件中找到#ifndef _CE_DCOM语句,
  #ifndef _CE_DCOM
DECLARE_REGISTRY_RESOURCEID(IDR_xxxxx)
#endif
  改为
  #ifdef _CE_DCOM //由#ifndef->#ifdef
DECLARE_REGISTRY_RESOURCEID(IDR_xxxxx)
#endif

5)RegisterClassObjects和RevokeClassObjects重定义
1>C:\WTL81\Include\atlapp.h(154) : error C2084: 函数“HRESULT ATL::CComModule::RegisterClassObjects(DWORD,DWORD) throw()”已有主体
1>        F:\Xp ProgramFiles\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include\atlbase.h(4471) : 参见“RegisterClassObjects”的前一个定义
1>C:\WTL81\Include\atlapp.h(156) : error C2084: 函数“HRESULT ATL::CComModule::RevokeClassObjects(void) throw()”已有主体
1>        F:\Xp ProgramFiles\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include\atlbase.h(4472) : 参见“RevokeClassObjects”的前一个定义

解决办法:
修改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
加上宏开关
#ifndef _WIN32_WCE 
namespace ATL
{
  inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw()
  { return E_NOTIMPL; }
  inline HRESULT CComModule::RevokeClassObjects() throw()
  { return E_NOTIMPL; }
}; // namespace ATL
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值