VC6.0 工程转到VS2008一些问题的描述及解决方法(附有VS2008发布程序介绍)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1. warning:   D9035 : Fr"选项已否决,并将在将来的版本中移除
D9036 : 使用“FR”而不使用“Fr"

解决方法:
设置Project propert/C/C++/浏览信息/启用浏览信息/“无本地符号(/Fr)"---->"包含所有浏览信息(/FR);


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2. warning : WINVER not defined. Defaulting to 0x0600(Windows Vista)

Answer:
#define WINVER 0x0400
0x0400 is for Windows NT 4.0. For Windows 2000 use 0x0500
Note: Define it for the lowest operating system you need your app to run on, not the OS you build on.
It defaulted to 0x0501 because you build on XP but defining it as 0x0400 will allow it to run on Windows 2000 as well.
example: In StdAfx.h 开始时写入:
#ifndef   WINVER
#define   WINVER   0x0500
#endif


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3.warning: CWinApp:: Enable3dControls() is no long need.

这两个函数的调用是旧的MFC版本对新版本的操作系统特性的支持,在新的(那个时候是新的)Windows 95平台上要这样调用一下才能使用新的Windows 3D样式的控件,否则就是老的Win 3.2样子的控件。想当初喜欢OWL就是因为感觉它的控件比较“酷”,比如那个带底纹的对话框,菱形的checkbox,还有带图标的“OK”按钮,看到 MFC作出来的灰灰的界面就觉得土,不过后来就知道MFC做界面也是很漂亮的,比如我做的。。。。,再打住。对于新的MFC版本来说已经不需要再调用这两 个函数了,参考前面的方法,用_MSC_VER对其隔离就行了:

#if _MSC_VER <= 1200 // MFC 6.0 or earlier
#ifdef _AFXDLL
Enable3dControls();           // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();   // Call this when linking to MFC statically
#endif
#endif


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4.warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

1. VS2008打开相应文件,再保存一遍就好了。
2. 试一下,文件中某些地方用到的空格不是Unicode的。打开那个文件,如果文件顶层注释上面有一个空行,就把它删了试试!也需有用哦
(1)转换Code文件为Unicode格式;
(2) 在Project -> Properties -> Configuration Properties -> C/C++ -> Advance 的 Disable Specific Warnings 中添加相应的警告编号:4819;
(3)或找出不符合Unicode格式的文件,然后在该文件的开始处加入下面的语句:# pragma warning (disable:4819)


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5. error C2440: ’static_cast’ : cannot convert from ‘UINT (__thiscall CStaticLink::* )(CPoint)’ to ‘LRESULT (__thiscall CWnd::* )(CPoint)’

If you are updating from VS2003 to VS2005, C++, you might run across an error like this. What it means is that they changes the return types from 2003 to 2005. You just need to change the UINT to an LRESULT and you should be good to go.


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6. error : "无法开启MFC42.lib"

(推荐方法1)
1.如果主工程下用到了一些DLL,这些DLL 是在VC6.0下编出来的,我们需要这些DLL 也在VS2008重新编译。否则在Windows7 下编译主工程会有找不到MFC42.lib 等错误。
2. 选择静态链接MFC;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
7.处理Manifest问题
VS2005,2008工程需要使用Manifest文件,记录“工程依赖项”。所以必须要生成Manifest文件。
设置:Project propert/ linker/ Manifest/ 生成清单:是。
Project propert/ linker/ Manifest Tool/ 嵌入清单:是。
(VC6.0 没有嵌入清单的功能。需要我们自己写出Manifest放入工程,然后编入工程资源中或者放入应用程序层。但是VS2005,2008有自动生成及嵌入清单的功能)


Manifest 文件还有一些功能: 1.设定程序运行用户权限; 2. 支持Microsoft.Windows.Common-Controls.
1. 设定程序运行用户权限: 设置Project propert/ linker/ Manifest/ 启用用户帐户控制(UAC):是;
UAC 执行极别:asInvoker (默认值);
UAC 绕过UI保护:否;



//////////////////////////////////////////////////////////////////////////////////////////////////////////////
2.支持Microsoft.Windows.Common-Controls.
分几种情况: 如果用VS2008 则在生成工程向导中,在“高级功能设定中”,勾选“公共控件清单”项。然后编译工程时按照上述方式选择“生成清单”。 清单自动生成并包含支持Microsoft.Windows.Common-Controls.

    如果创建工程时,没有设置此选项,我们可以后期在Project propert/ linker/ Manifest/ 附加清单依赖项:
添 加type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'

    从VC6.0升级到VS2008的工程。因为VC6.0的Manifest文件是外部的。 VS2008默认是自动生成嵌入式Manifest.所以两个会发生冲突:

    error : CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:2, language:0x0409
LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

(推荐解决方案3)
解决方案:1. Project propert/ linker/ 启用增量链接:否;(关闭增量链接)
2. 设置工程属性->配置属性-> 清单工具->输入和输出->嵌入清单,选择[否]
3. 在工程的.rc文件里面删除了manifest块. 删除VC6.0外部Manifest文件。设置生成嵌入式清单,并在附加清单依赖项:   Microsoft.Windows.Common-Controls。
( 有什么时候删除VC6.0外部Manifest文件后,编译会出现问题: 嵌入清单:否;编译。。
删除manifest块和VC6.0外部Manifest文件。编译。
嵌入清单:是; 编译。
这个方法或许可以解决 “删除VC6.0外部Manifest文件问题”。不肯定,请多试。            

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


8.warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

这个问题是C语言里面某些函数的安全性检查通不过。消除Warning信息方法:

(1)按照编译器推荐的把函数改为安全的。例如:strcpy改为strcpy_s;itoa改为_itoa_s等等;

(2)或设置Project -> Properties -> Configuration Properties -> c/c++ -> Preprocessor -> Preprocessor Definitons里面添加 _CRT_SUCURE_NO_WARNINGS / _CRT_SUCURE_NO_DEPRECATE


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
error LNK2019: unresolved external symbol "wchar_t * __stdcall _com_util::Co.....
解决方法,
Property page ->C/C++ ->Language ->treat Wchar-t 改为 No


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
下列附有VS2008发布程序介绍:
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


下列附有VS2008发布程序介绍:
vc2008程序发布指南2008-05-03 17:46vc2008开发的程序的发布方式可以有5种方式:

1. 采用静态链接到crt和MFC. 只要你拥有组成程序的所有源代码,你就可以采用这种方式,
这种方式除了程序变大一点,好处多多:
1) 不必重新发布vc2008基础库vcredist_x86.exe(安装到WinSxS).
2) 不必产生,嵌入manifest.
3) 也不把vc2008基础库放在程序所在目录.

2. exe(嵌入manifest) + vcredist_x86.exe

   确保程序正确产生并嵌入manifest文件,然后把程序和vcredist_x86.exe一起发布.用户先安装
vcredist_x86.exe(安装到WinSxS),然后程序就能正常运行了.

3. exe(嵌入manifest) + 用到的基础库文件放到程序目录(包括库文件本身的manifest文件)

   确保程序正确产生并嵌入manifest文件,然后把程序用到的vc2008基础库相关文件复制到程序
所在目录,这种方式适用于用户没有安装过vcredist_x86.exe,一旦用户安装过vcredist_x86.exe,
若WinSxS中的相关文件遭到破坏,那么即使在程序目录放上所有用到的vc2008基础库,程序也跑
不起来;若WinSxS中的相关文件正常,那么程序目录下的相关文件就是多余的了,删掉它们程序也能
正常运行.

4. exe(自行编写manifest) + vcredist_x86.exe

5. exe(自行编写manifest) + 用到的基础库文件放到程序目录(包括库文件本身的manifest文件)


另外,C:/Program Files/Common Files/Merge Modules 目录下有相应库的集成模块可以直接集成到安装包中去.


附录:

A. 自行编写的manifest文件命名: abc.exe 对应abc.exe.manifest

B. 与程序对应的manifest的格式:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>

<dependency>                                // VC9 的CRT, 基本上所有用vc2008的程序都需要下面一段
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>

                                              //用到 VC9的MFC库,需要加下面一段
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.MFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>

<dependency>                                //想使用windows xp 的6.0版本的通用控件,加需要下面一段
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
</dependentAssembly>
</dependency>

</assembly>

C. 如何确保程序正确产生并嵌入manifest文件?
- xxxproject > properties > Configuration Properties > Generate Manifest: 确保为Yes
这个与Configuration Properties >Linker > Manifest File >Generate Manifest都是指同一个设置.
- Project > Tool Build Order > Manifest Tool确保打勾.
release版本可以看到有: xxx.exe.intermediate.manifest 生成, 它是由linker生成的,由manifest tool嵌入程序的.
debug版本manifest tool把xxx.exe.intermediate.manifest嵌入程序后还会输出一个xxx.exe.embed.manifest,供检查内容是否一样

新学期领福利!购实物周边送年卡会员! T恤、键盘、双肩包等周边任选!还能解锁资源下载、VIP文章等多重会员权益! 阅读详情

相关推荐

一步步教你从VC 6.0 转到 Visual Studio 编写C程序

本文用图片介绍怎样用Visual Studio 2010 一步步建立C工程 。同时对建立工程中,VS可能会遇到的问题进行了分析,如 Cannot find or open the PDB file 和程序闪退看不到结果。

Jason Gel 的专栏 1万+

VC日志类调试信息输出

功能:输出日志信息logfile.h VC日志类调试信息输出,是编程调式跟踪流程的日志输出好帮手,很有助于程序的排错调试.1,使用简单方便.只有一个头文件logfile.h include后,直接调用函数即可2,VC6,VC7(VS系列,VS2008) 兼容VC版本3,可输出文件名及行号4,支持多线程应用 Debug版本宏1 设置控制台宏2 设置文件名宏3 设置等级宏4

VC++6.0向导中完成项目迁移到VS2012版的错误

编译时遇到两个问题,首先是 error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )(BOOL,HTASK)换为“void (__thiscall CWnd::* )(BOOL,DWORD)” 1>          从基类型到派生类型的强制换需要 dynamic_cast 或 static_cast erro

学习,积累,沉淀,融入~~~ 5883

VC6.0工程升级到VS2010遇到问题解决办法

今天尝试将原先编写的VC6.0下的工程升级到VS2010下,升级过程中遇到了各种各样的问题,网上针对升级遇到的问题有不少的讨论,这里仅针对我的项目程序升级过程中遇到的问题解决办法进行了总结,希望对大家有所帮助。 1.编译错误C2065 1>c:\documents and settings\administrator\桌面\host_sp3\selectdialog.cpp(62):

Ryan 的 Blog 4998

()VC6.0VS2010

[Quote=引用 14 楼 akirya 的回复:] mfc没啥问题吧,我直接用VC5的mfc头文件,链接对应的mfc42直接就过去了。 [/Quote] :O!!!! 看到坏编译通过,我重新有了解决它的信心,再去试! 今天发现了一个很好的链接的命令行, /verbose,可以显示查找符号时候的详细过程。 在一通折腾之后终于成功的解决了这个问题,兴奋之余,上来结贴: 工程的incl

myknowledge的专栏 4608

VC++6.0转到VS2008

刚从VC++6.0转到VS2008,用着好不习惯,网上找到一帖子,给大家,希望会有帮助。 ------------------------------------------------------------------------------------------------------------------------------- 1.MessageBox() VC

vivigege的专栏 1538

VC6.0工程转到VS2008一些问题描述解决方法

[]VC6.0工程转到VS2008一些问题描述解决方法  下列为VC6.0 工程转到VS2008一些问题描述解决方法 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1. warning:

没有根柢盘深,怎有枝叶峻茂 2012

VC6.0VS2008升级项目

1.VC 6.0中可以对着类右键,选择【Add Windows Message Handler】来添加类似于WM_MOUSEMOVE的消息响应函数在VS 2008中 右键,属性,有个"消息",然后找到对应的消息点"添加"  2.访问 ClassWizard 和 WizardBar 功能Visual C++ 的早期版本

liufei_learning--脚踏实地,戒骄戒躁! 2309

vc6.0转到vs2008出现的错误

将碰到的问题归纳如下: 1消息映射 VS2008对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2008下编译不通过 a. ON_MESSAGE(message,OnMyMessage);    OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);如果不符

oyanghaizhi的专栏 884

VC6.0移植到VS2008后的错误总结

移植 升级 VC6.0 VS2008

JuanA1的专栏 8219

VS2003工程VS2008工程与新建VS2008的Qt工程时遇到的问题及其解决方法

作者:reille 本博客网址:http://blog.csdn.net/reille/ 本文内容概要:详细描述VS2003工程(project)VS2008工程与新建VS2008的Qt工程时遇到的问题及其解决方法。 ——————————————————————————

reille的笔记 1万+

vc6.0移植到vs2008问题总结

最近由于要在SISCO的MMS库基础上开发,需将开发平台由VC6.0升级至VS2008,所以需要将原有的项目迁移,免不了碰到移植上的一些问题,特将它们归纳如下: 1 消息映射 VS2008对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2008下编译不通过 a. ON_MESSAGE(message,OnMyMessage); OnMyMessage返回值必须为LRESUL

王教余的专栏 1299

VC6 程序VS2019或其他高版本上编译运行

核心思路: 利用VC6的编译器,利用VS2019等高版本的IDE 前提条件: 1.需要安装VC6VS2010(daffodil依赖2010),VS2019或2017 (下载地址:https://msdn.itellyou.cn/) 2. 下载并安装daffodil 下载地址:https://bbs.pediy.com/upload/attach/201901/716193_E9PXBS...

知行合一 1万+

VC6.0平台级到VS2008平台(之一)

VC6.0平台级到VS2008平台最近在在把一些程序VC6迁移到VS2008,由此而关注到一些这方面的知识,找了一些资料,根据自己遇到的一些情况,结合在一起,整理出来这篇文章,希望对以后有这方面工作的人多一些参考,如果大家还有可很享的可以跟贴。。。。1、关于 #define WINVER提到这个问题是因为,这里涉及到Winodws版本的定义。关于版本定义的关键无外乎为程序头文件中对

Heru 4248

一直用VC6,刚改用VS2008,发现一个大问题

<br />VS2008的速度比VC6慢了N倍,最新电脑4G内存上,还这么慢,<br />实在不正常<br />用VC6编译,基本立刻开始了,2008非要慢吞吞的加载不知道什么东西。<br />我对比了VC6,发觉2008的界面设计好像完全不同,用的类似于IE浏览器的那种技术,<br />速度慢的出奇,<br />加载一个大工程,简直等的心急,让我想起N年前用赛扬处理器的黑暗年代的故事。<br />画面比vc2003好,实际功能不好说,帮助文档比较丰富,还有就是字好小<br />没用过2008,一直在用20

cl52155的专栏 761

VC6.0VS2008的OpenGL环境配置

OpenGL在VS2008下环境配置 1.具体配置过程: (1)、将.h文件拷贝到C:\ProgramFiles\Microsoft Visual Studio 9.0\VC\include\GL目录中(没有GL目录就自己创建一个)。一般根据需要包含就行了,但为了一次性解决问题避免以后再次去配置包含,此处我们将所有的.h文件包含进来。 (2)、将.lib文件拷贝到C:\ProgramFile

没有根柢盘深,怎有枝叶峻茂 1494

VS2008VC6.0下使用pthread.h头文件

要在windows环境下使用 #include 头文件,编译会提示没有该头文件, 此时需要下载PTHREAD在windows下的开发包 1、下载PTHREAD开发包,如pthreads-w32-2-8-0-release.exe 地址在这 ftp://sourceware.org/pub/pthreads-win32 2、双击该.exe文件,出现如下界面:

liuyongli1992的博客 2315

vc6.0程序VS2005移植

vc6.0编译成功的程序要移植到VS2005中运行 如果不加修改 会出现很多错误问题的原因是字符串ANSI和Unicode编码的区别, VC6VS2003等默认使用ANSI编码,而VS2005及VS2008默认采用Unicode. 简而言之 ANSI用1个字节表示字符,Unicode用2个字节表示1个字符. 若想要你的代码在VS2005中编译通过,3中方法:

bitwjg的专栏 1391

vs2008打开dsw损坏_VC++6.0转到VS2008常出现的错误及解决方案

刚从VC++6.0转到VS2008,用着好不习惯,网上找到一帖子,给大家,希望会有帮助。--------------------------------------------------------------------------------------------------首先在此引一例子当源文件由vc++6.0转到vs2008时会出现如下错误:错误一:error C2039: 'Wr...

weixin_32729025的博客 704
上一篇: 题目分类
下一篇: 写程序的常用快捷键
weigetc
博客等级 码龄20年 3粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值