从EVC4.0迁移到VS2005

//========================================================================
//TITLE:
//    从EVC4.0迁移到VS2005
//AUTHOR:
//    norains
//DATE:
//    Friday  21-December-2007
//Environment:
//    EVC4.0 + Windows CE 5.0 Standard SDK
//    EVC4.0 + SDK-WINCE5.0-MIPSII
//    VS2005 + SDK-WINCE5.0-MIPSII   
//========================================================================

    微软在兼容性方面做得可谓极致,不需要太多的设置,便可从evc4.0工程可以平滑地升级到vs2005.
   
1.项目迁移
    运行vs2005,点击菜单"File..."-->"Project/Solution..",选择evc的工程目录文件"*.vcp"和"*.vcw".在这里无论选择哪个文件都能顺利转换,但如果所迁移的evc工程中包含多个子工程,建议选择"*.vcw",这样可以保持原有的工程目录结构不丢失.确认文件选择之后,会出现警告对话框,提示转换是不可逆转的.不管它,直接点击"yes".迁移转换完毕,即可在vs2005中对原有工程进行编译.
   
    这里有点要说明的是,虽然在转换过程中出现转换警告框,但其实vs2005并没有对evc4.0的工程文件做变动,所以转换之后你依然可以用evc4.0打开"*.vcw"或"*.vcp"进行编译.之所以会如此,是因为vs2005的工程后缀名为"*.sln",与evc的工程名不重合,所以可以和evc4.0工程共存.
   
   
2.SDK
    如果在安装evc4.0之后安装了wince5.0的SDK,接着又安装vs2005,那么我们在vs2005中是无法看到所安装的SDK的.这时我们只需要重新运行SDK包安装程序,然后选择"Repair"进行修复. 修复完成之后,无论在evc4.0还是vs2005均可见到该SDK.
   
   
3.代码
    由于vs2005与EVC4.0支持的C++标准不同,所以有些代码不一定两者都能兼容.
    现在来举三个代码片段来说明:
   
    1).vs2005编译通过,evc4.0无法编译通过.
    int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
    {
      for(int i = 0; i < 10 ; i++)
      {}
     
      for(int i = 0; i < 10 ; i++)
      {}
     
      return 0;
    }
   
    EVC编译时会提示错误:error C2374: 'i' : redefinition; multiple initialization.
    导致两者差异的原因是两个编译器对变量i的生存周期理解不同.
   
    2)vs2005无法编译通过,evc4.0编译通过.
    int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
    {
     unsigned short *usTemp = NULL;
     wchar_t *wTemp = NULL;
     wTemp = usTemp;     
      return 0;
    }
   
    vs2005编译时提示错误: error C2440: '=' : cannot convert from 'unsigned short *' to 'wchar_t *'
    主要是因为两者编译对隐形形参转变的标准不同,虽然在MIPS架构中unsigned short和wchar_t都是双字节,vs2005也毫不留情认为这是错误的.如果遇到此类情况,可在vs2005中进行强制类型转换.
   
    3)vs2005和evc4.0都能编译通过,但在运行时其中一个编译器编译出来的会有异常发生,另外一个却非常正常.
    int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
    {
        TCHAR szBuf[MAX_PATH] = {0};
        #define STR_DEF TEXT("DEFINE App")
        _tcscpy(szBuf,_tcslwr(STR_DEF));
    }
    如果选择的CPU为MIPSII类型,则该段代码由evc4.0编译后运行正常,但如果是由vs2005编译的程序,运行后则提示内存溢出异常.追根究底,这还是编译器实现的不同.从函数的定义来看,vs2005编译的程序出现异常才是正确的,而evc4.0编译后能正常运行完全是因为该版本的MIPSII编译器有bug,具体可参考我另一篇文章:《VS2005和EVC4字符串宏在MIPSII架构的比较》.
   
   
    像上述所列的第一和第二种情况在编译的时候已经出现,所以不难找出问题根源并加以解决.最怕就是遇到第三种情况,虽然能编译通过,但在运行时总能给出意想不到的结果.遇到第三种情况,不妨换其它的编译器试试,说不定问题就出在编译器上. 

posted @ 2007-12-21 22:29  我的一天  阅读(237)  评论(0编辑  收藏  举报