也谈EVC工程移植

也谈EVC工程移植
本文是针对作者本人的一个具体的移植项目,将碰到的所有问题列出来,并给出具体的解决方法。由于是一个具体的项目,因此不能把所有的EVC工程移植问题囊括进来。所以,在移植项目前,建议还是看看以下的文章:
循序渐进:将 eMbedded Visual C++ 应用程序迁移到 Visual Studio 2005
eMbedded Visual C++ 到 Visual Studio 2005 升级向导(注意其最后一句话:默认情况下,Embedded Visual C++ 4.0 版会将 MFC Pocket PC 应用程序的对话框样式(Border)设置为 DS_MODALFRAME。MFC 8.0 不支持此样式。 —— 应改为Thin,如果不改的话,窗口就无法弹出。)
从 eVC 移植所带来的已知问题
Migrating Microsoft eMbedded Visual C++ Projects to Visual Studio 2005
开发环境:Windows XP +SP2, Visual Studio 2005 professional, Windows Mobile 6.0 Professional SDK。
注:(1)对于Windows Mobile 5.0 SDK 开发的程序在Windows Mobile 6.0 下也能运行,而且不需要对程序进行任何的修改。
(2)由于有些错误,是环境配置问题,所以在Debug/Resease模式下,都需要进行修改,以下错误中,如果是这类错误,都在标号后面写着“Resealse 模式也需要改”,当天切换到别的SDK下,如Windows Mobile 5.0 SDK,也需要修改。
以下是针对Debug模式下的:
1、StdAfx.cpp (Resealse 模式也需要改)
编译错误:D:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxver_.h(77) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
解决方法:右击工程名,打开Project properties对话框,切换到C/C++->Code generation页,将Runtime Libarary 设置成“Multi-threaded DLL(/MD)”,即可解决此问题。
2、编译错误:error C2065: 'i' : undeclared identifier
原因:是由于存在以下的代码段:
for (int i = 0; i < MAX_LEN; i ++)
{
//……
}
for (i = 0; i < MAX_NUM; i ++)
{
//……
}
对于evc离开循环后,循环变量仍然有效,并且仍可以使用,但是在VS2005下是不行的,由此可见VS2005对变量的定义与审查更为严格,还有就是对数组越界问题也比EVC来的强。
解决方法:(不能完全相信编译器,也不能把所有的语法检查都丢给编译器)
int i = 0;
for (i = 0; i < MAX_LEN; i ++)
{
//……
}
for (i = 0; i < MAX_NUM; i ++)
{
//……
}
3、error C2664: '_wcsnicmp' : cannot convert parameter 2 from 'LPWORD' to 'const wchar_t *'
需要强制类型转换。
4、error C2061: syntax error : identifier 'HELPINFO'
自己增加HELPINFO的类型,增加头文件HelpInfo.h。
5、error C2146: syntax error : missing ';' before identifier 'm_wndCommandBar'
原因:在Windows Mobile 5.0/6.0 下CCeCommandBar类被CCommandBar替换
解决方法:
CCeCommandBar m_wndCommandBar; ---- 〉CCommandBar m_wndCommandBar;
6、error C2065: 'NUM_TOOL_TIPS' : undeclared identifier
解决:
//#if defined(_WIN32_WCE_PSPC) && (_WIN32_WCE >= 212)
#define NUM_TOOL_TIPS 8
//#endif
7、error C3861: 'ON_WM_HELPINFO': identifier not found
同 4
8、error C2440: 'static_cast' : cannot convert from 'void (__cdecl CMyAppView::* )(void)' to 'LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)'None of the functions with this name in scope match the target type
解决方法:
afx_msg void OnHotLinkExplain(); --- 〉
afx_msg LRESULT OnHotLinkExplain(WPARAM wParam,LPARAM lParam);
9、error C2664: 'CSize CDC::GetTextExtent(LPCTSTR,int) const' : cannot convert parameter 1 from 'WORD *' to 'LPCTSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast需要强制转换
pDC->GetTextExtent(&i, 1).cx); ——>
pDC->GetTextExtent((LPCTSTR)&i, 1).cx;
10、error C2039: 'OnHelpInfo' : is not a member of 'CView'
error C2039: 'OnHelpInfo' : is not a member of 'CFrameWnd'
error C2039: 'OnHelpInfo' : is not a member of 'CDialog'
解决方法:用TRUE替换相应的类成员函数OnHelpInfo'
return CView::OnHelpInfo(pHelpInfo); ——> return TRUE;
11、error C2039: 'm_bShowSharedNewButton' : is not a member of 'CCommandBar'
D:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxext.h(557) : see declaration of 'CCommandBar'
解决方法:
直接注释掉 m_wndCommandBar.m_bShowSharedNewButton = FALSE;
12、.\MyApp.rc(380) : fatal error RC1015: cannot open include file 'wceres.rc'.
解决方法:
直接注释掉:#include "wceres.rc" // WCE-specific components
但是,这个错误很讨厌,每次你修改资源文件后,都得修改该语句,不知道为什么。
13、Resease 模式下也要修改
error LNK2019: unresolved external symbol SHInitExtraControls referenced in function "protected: __cdecl CMyAppView::CMyAppView(void)" (??0CMyAppView@@IAA@XZ)
问题:程序中调用了SHInitExtraControls();
error LNK2019: unresolved external symbol SHSipPreference referenced in function "protected: void __cdecl CMyAppView::OnKillfocusWord(void)" (?OnKillfocusWord@CMyAppView@@IAAXXZ)
问题:程序中调用了SHSipPreference
以上两个函数都在:Library: aygshell.lib里
解决方法:
工程-->属性-->Linker -->input -- > Additional Denpendencies :aygshell.lib
14、Resease 模式下也要修改
orelibc.lib(wwinmain.obj) : error LNK2019: unresolved external symbol wWinMain referenced in function wWinMainCRTStartup
属性—〉Linker—〉Anvanced—〉EntryPoint
将 wWinMainCRTStartup 更改为 WinMainCRTStartup
Entry Point是WinMainCRTStartup(ANSI)或wWinMainCRTStartup(UINCODE),即: ... WinMainCRTStartup 或wWinMainCRTStartup 会调用WinMain 或wWinMain。
15、 error C3861: 'LoadStdProfileSettings': identifier not found
注释掉函数 LoadStdProfileSettings;
该函数的具体功能,看MSDN。
BTW:编译的时候,有可能会出现一些由以上错误产生的连锁错误,俗称“蝴蝶效应”,如error C2143: syntax error : missing ';' before '}'
error C2143: syntax error : missing ';' before ','
error C2143: syntax error : missing ';' before '{'
少了了'{'、'}'、';'等等,把以上的错误—主要矛盾解决了,这些错误—错误矛盾也就迎刃而解了。何况,这个工程是以前在EVC IDE下编译通过,MS再怎么优化或改进编译器,也总不可能发生自相矛盾的事情吧,总要考虑兼容性吧,要对自己或公司的前辈有信心!
到此,已经能够编译通过,但是运行的时候,又出现如下的问题:
16、Resease 模式下也要修改
按F5,出现如下的对话框:

解决方法:
右击工程的属性—〉General—〉Project Defaults –〉Use MFC :
Use MFC in a shared DLL ——> Use MFC in a static DLL
也正是因为这个,VS2005产生的EXE程序比EVC产生的要大200多k。

这样,程序基本移植完成,但是还要把所有的功能过一遍,有可能还会碰到,诸如对话框出现乱码、菜单不对等问题。

分类: Windows Mobile
绿色通道:好文要顶关注我收藏该文与我联系
梦书
关注 - 1
粉丝 - 4+加关注00(请您对文章做出评价)» 下一篇:Panic Lookup[zz]

posted on 2007-03-15 14:06 梦书 阅读(8317) 评论(12) 编辑 收藏


评论
893224
#1楼 2007-03-16 21:39 fish[未注册用户]
evc4的MFC工程转为vs2005后某些菜单项为灰色 不能点击
而且按钮也不能相应 请问下你哪得问题?  回复 引用 

#2楼[楼主] 2007-03-17 10:43 梦书
建议检查下代码(处理菜单状态的代码),我之前的一个项目也是,由于有些函数不起作用,导致状态不能变化的缘故  回复 引用 查看 

#3楼 2007-03-18 18:32 fish[未注册用户]
在vs2005上做Pocket PC
自动生成的命令栏是在底端 怎么才能移到顶端去
我用下面的代码为什么不行?
CRect rect;
GetClientRect(&rect);

::MoveWindow(m_wndCommandBar.m_hCommandBar,0,0,
rect.Width(),m_wndCommandBar.Height(),TRUE);

::BringWindowToTop(m_wndCommandBar.m_hCommandBar);

 回复 引用 

#4楼[楼主] 2007-03-19 08:44 梦书
@fish
这个我没有研究过,但是应该跟开始菜单一样,去微软的技术论坛问问]
http://forums.microsoft.com/msdn/default.aspx?siteid=1
 回复 引用 查看 

#5楼 2007-03-26 13:50 litterstar
任职要求:
1,熟悉EVC或者C#语言,了解WML、WMLScript,并且有良好的编码实现能力和编程习惯;
2,掌握一种或以上移动开发平台,包括Windows Mobile、Linux、Symbian、BREW等等,并且了解其体

系架构;
3,有过地图应用开发,对于GIS、LBS、Mobile GIS有了解者优先;
4,工作认真负责,擅长沟通,有吃苦耐劳的团队精神;
工作内容:
1、Windows Mobile应用开发,包括掌上移动办公平台
2、嵌入式GIS平台研发
欢迎有2年以上专职Windows Mobile应用开发工作经验人员发简历zjun@csspnet.com.cn,或加MSN:

zjun@pnetsoft.com.cn
待遇(4-10K),发展空间大。 公司(中软强网)网站:www.csspnet.com.cn  回复 引用 查看 

#6楼 2007-04-11 10:39 HAOJie[未注册用户]
请问依照您的提示第14步修改后出现如下的错误:
error LNK2019:unresolved external symbol main referenced in function WinMain wcecompat.lib.
请问是什么原因造成的,万分感谢!  回复 引用 

#7楼[楼主] 2007-04-11 14:01 梦书
@HAOJie
你修改前,如果没有第14的错误,就不要修改。
问题可能是出在wcecompat.lib,不知道你这个库函数是干什么的。
 回复 引用 查看 

#8楼 2007-05-05 11:44 刘杰[未注册用户]
紧急求助!!!!!!!!
1、StdAfx.cpp (Resealse 模式也需要改)
编译错误:D:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxver_.h(77) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
解决方法:右击工程名,打开Project properties对话框,切换到C/C++->Code generation页,将Runtime Libarary 设置成“Multi-threaded DLL(/MD)”,即可解决此问题。
我现在就遇到了这个问题,我用的是EVC4.0,我按照你的办法打开设置,但是发现里面只有Runtime Libarary,它那个下拉框里也只有CE Runtime*,并没有Multi-threaded DLL(/MD),请教一下,这个怎么改啊?
我这个事情很急,如果兄弟你看到我的留言的话,请给我回个信好不?
我的QQ是94384249
邮箱是:jacky0097@163.com
谢谢了!  回复 引用 

#9楼[楼主] 2007-05-08 09:06 梦书
@刘杰
你的不是EVC 4 的工程向VS2005移植?
“解决方法:右击工程名,打开Project properties对话框,切换到C/C++->Code generation页,将Runtime Libarary 设置成“Multi-threaded DLL(/MD)”,即可解决此问题。”
这个是在VS2005里的,不是针对EVC4.0的。  回复 引用 查看 

#10楼 2007-05-08 10:41 magic[未注册用户]
请问在移植过程中出现类似于您列举的第八个错误,但是修改后报错说需要一个返回值,请问是写成return NULL,还是什么其他的?

多谢!  回复 引用 

#11楼[楼主] 2007-05-08 16:00 梦书
@magic
你看看LRESULT 的类型定义:
typedef LONG LRESULT; //from windef.h

就知道了
正确的可以返回0
错误的考验返回-1之类的值  回复 引用 查看 

#12楼 2007-09-14 16:35 徐海[未注册用户]
corelibc.lib(pegwmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function WinMainCRTStartup
ARMV4IRel/unit_CE.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.  回复 引用 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值