一、VS2005新建工程(跟要移植的工程同名,这样可以复制资源)。
二、把evc下的.h 和.cpp文件复制到新工程,把原.rc文件覆盖新工程.rc。
复制资源有几种方法,这里引用一个网友xuyongbeijing2008的文章
法1:
在你的工程中添加另一个工程的rc文件,这时资源视图中就会出现两个rc,从后加的rc中拷贝资源到你自己工程的rc中就可以了。
在VC6环境下,选择Class视图,选中想要克隆的对话框所对应的类,例如CAboutDlg,点击鼠标右键,选择Add to gallery。在新工程中选择Project菜单,选择Add Component and ActivX,你会看到多了一个文件夹(与上一个工程同名),进入该文件夹,选择*.ogx。选择Insert,你会发现原来的对话框被加入到新的工程中了!
第一步:用记事本打开原工程的.rc文件,找到想复制的对话框的信息,如下所示
IDD_UGMS_DIALOGDIALOGEX 0, 0, 320, 230
STYLE WS_CHILD | WS_VISIBLE
EXSTYLE WS_EX_APPWINDOW
FONT 9, "宋体"
BEGIN
GROUPBOX "学生信息",IDC_STATIC,10,8,290,200
GROUPBOX "",IDC_STATIC,25,55,205,120
PUSHBUTTON "最前(&F)",IDC_BUTTON_FIRST,30,30,35,15
PUSHBUTTON "向前(&B)",IDC_BUTTON_PRE,82,30,35,15
PUSHBUTTON "向后(&N)",IDC_BUTTON_NEXT,134,30,35,15
PUSHBUTTON "最后(&L)",IDC_BUTTON_LAST,186,30,35,15
PUSHBUTTON "查询(&Q)",IDC_BUTTON_QUERY,246,70,40,15
PUSHBUTTON "增加(&A)",IDC_BUTTON_ADD,246,96,40,15
PUSHBUTTON "修改(&M)",IDC_BUTTON_MODIFY,246,122,40,15
PUSHBUTTON "删除(&D)",IDC_BUTTON_DELETE,246,148,40,15
PUSHBUTTON "确定(&O)",IDC_BUTTON_OK,58,183,40,15
PUSHBUTTON "取消(&C)",IDC_BUTTON_CANCEL,150,183,40,15
LTEXT "学号:",IDC_STATIC,52,75,25,8
LTEXT "姓名:",IDC_STATIC,52,100,25,8
LTEXT "性别:",IDC_STATIC,52,125,25,8
LTEXT "入学时间:",IDC_STATIC,44,151,41,8
EDITTEXT IDC_EDIT_SID,91,72,95,15,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_SNAME,91,96,95,15,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_SSEX,91,120,95,15,ES_AUTOHSCROLL
CONTROL "DateTimePicker1",IDC_DATETIMEPICKER_SCOMEDATE,
"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,91,144,
95,15
GROUPBOX "",IDC_STATIC,25,19,205,35
END
上面代码中绿色背景代表的是要复制的对话框资源的ID,此段代码也就是.rc文件中记录的此对话框的信息,黄色背景中间的代码就是
相应对话框中添加的控件信息,只需将相应代码拷到新工程的相应.rc文件相应的ID对话框资源的BEGIN 和END之间即可;
第二步:打开原工程的FileView视图下的Header Files 下的resource.h文件,将其中相应ID的信息复制到新工程的resource.h中即可;
例如:
//复制的资源ID
#define IDC_BUTTON_FIRST 1000
#define IDC_BUTTON_PRE 1001
#define IDC_BUTTON_NEXT 1002
#define IDC_BUTTON_LAST 1003
#define IDC_BUTTON_QUERY 1004
#define IDC_BUTTON_ADD 1005
#define IDC_BUTTON_MODIFY 1006
#define IDC_BUTTON_DELETE 1007
#define IDC_BUTTON_OK 1008
#define IDC_BUTTON_CANCEL 1009
#define IDC_EDIT_SID 1010
#define IDC_EDIT_SNAME 1011
#define IDC_EDIT_SSEX 1012
#define IDC_DATETIMEPICKER_SCOMEDATE 1013
第三步:记得不要遗漏啊,如有ID重复,可以更改一下即可!
法4:
三、修改错误
这里也引用一个ziseliuxingzh博客的内容
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。