zoukankan      html  css  js  c++  java
  • [转]evc4工程移植vs.net2005所碰到的问题积累

    转自:http://hi.baidu.com/copperlee/blog/item/c5c7abdc2a5f9fa3cc116638.html

     

    在移植项目前,建议还是看看以下的文章:
    循序渐进:将 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 FilesMicrosoft Visual Studio 8VCceatlmfcincludeafxver_.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 FilesMicrosoft Visual Studio 8VCceatlmfcincludeafxext.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。

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


    [收集FROM 蓝天清水博客]
    在将evc4的工程移植到.net2005时会碰到很多问题,以下只是其中我遇到的一些问题的摘录以及相关的处理结果:

    1.首先在将EVC4的工程转化成.net2005时要将工程的属性中的c/c++->代码生成->运行时库改为:多线程DLL(/MD)

    2.在工程的属性中的链接器->高级->入口点改为:WinMainCRTStartup

    3.遇到stdafx.cpp
    _CE_ACTIVEX was not defined because this Windows CE SDK does not have DCOM.
    _CE_ACTIVEX could be caused to be defined by defining _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA, but it is recommended that this be done only for single-threaded apps.
    _ATL_NO_HOSTING was defined because _CE_ACTIVEX was not defined.
    的错误:在stdafx.h文件里加上#define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA可解决.

    4.遇到StdAfx.cpp   
           WINVER      not      defined.      Defaulting      to      0x0501

    在工程的属性c/c++->预处理器->预处理器定义中加上_WIN32_WINNT=0x500试试 

  • 相关阅读:
    帕累托分布(Pareto distributions)、马太效应
    Generalized normal distribution and Skew normal distribution
    Secondary NameNode 的作用
    127.0.0.1和0.0.0.0地址的区别
    50070只有本机可以访问(除本机外无法访问)
    SecureCRT SSH 语法高亮
    深入理解VMware虚拟机网络通信原理
    CentOS Virtual Machine 设置SSH主机登录
    路由器(交换机)的光口和电口
    ECC校验
  • 原文地址:https://www.cnblogs.com/abinxm/p/1829163.html
Copyright © 2011-2022 走看看