项目从VC6 -> VS2008 常见问题

VC6项目移植到VS2008的若干问题——好的代码,从我做起,从现在做起。 VC6项目移植到VS2008中遇到的一些问题以及解决办法。 好的代码,从我做起,从现在做起。 阅读详情
* 警告 “初始化”: 截断常量值”
eg: char c=176;
原因:
数字默认是int型的,int的表示范围比char大,所以警告说,从int到char可能会截断




* warning C4996 “strcat”被声明为否决的
VC6转为vs2008之后,有1000+这样的警告:
1>D:\ACE_wrappers\ace/OS_NS_string.inl(110) : warning C4996: “strcat”被声明为否决的
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(78) : 参见“strcat”的声明
1>        消息:“This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
 
警告是无害的。这个警告是暗示涉及的函数可能会出现缓冲溢出。2008的编译器比之前的都更加严格,针对缓冲溢出,做了不少改进,2008中的一些函数,如 sprintf都建议使用 sprintf_s一类的来进行缓冲区溢出的保护.
其实解决方法就是:添加欲编译宏:,_CRT_SECURE_NO_DEPRECATE
 
添加预编译宏:在工程属性里,C++->预处理器->预处理器定义设置
 
 
* 多个头文件对boolean变量重复定义问题怎么解决?
错误现象:
在occi的oratypes.h中有对boolean的宏定义,
#ifndef boolean
#ifndef lint
typedef int boolean;
#else
#define boolean int
#endif
#endif
与rpcndr.h中的 typedef unsigned char boolean 有冲突;


解决方法:
网上说的更改.h文件包含位置,把对occi.h的引用放在了windows.h引用的后面
我的已经是这样了,之后发现重定义的两个都是typedef,因此,对oratypes.h做如下修改:
#ifndef boolean
#ifndef lint
//typedef int boolean;
#define boolean int
#else
#define boolean int
#endif
#endif
 
 
* error C2601: “CcameratestDlg::OnDestroy” : 本地函数定义是非法的
解决方法:仔细检查大括号等起始/结束标志是否匹配
 
我的问题是:
vc6:(有些多余的东西,本身也没用,影响了格式)
  BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  //{{AFX_MSG_MAP(CMainFrame)
  ON_WM_CREATE()
  ON_WM_TIMER()
  ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
  //}}AFX_MSG_MAP
    ID_***
    ID_****
  END_MESSAGE_MAP()
解决方法:删除多余的代码
  BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  //{{AFX_MSG_MAP(CMainFrame)
  ON_WM_CREATE()
  ON_WM_TIMER()
  ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
  //}}AFX_MSG_MAP
  END_MESSAGE_MAP()
 
 
* error C2440: “static_cast”: 无法从“UINT (__thiscall CTestDlg::* )(CPoint)”转换为
 
从vc6转移到vs2005   发生下面问题:  
  BEGIN_MESSAGE_MAP(CTestDlg,   CCaptionBtnDlg)  
          ON_WM_NCHITTEST()       //vs2005   检测错误在这里  
  END_MESSAGE_MAP()  
   
  afx_msg   UINT   OnNcHitTest(CPoint   point);
  UINT   CTestDlg::OnNcHitTest(CPoint   point)    
  {  
  ....  
  }  
 
解决方法:
  afx_msg   UINT   OnNcHitTest(CPoint   point);
  UINT   CTestDlg::OnNcHitTest(CPoint   point)
=>
  afx_msg   LRESULT   OnNcHitTest(CPoint   point);
  LRESULT   CTestDlg::OnNcHitTest(CPoint   point)
 
 
* 致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。
当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。
错误原因:该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索 MSDN,针对不同的情况,可以有不同的解决方案:
解决方案:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;(对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled headers 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置)PS:解释如下点击项目 点击属性 然后选择C/C++   预编译头 创建使用头文件 不使用预编译头文件
 
 
* 应用程序无法启动,因为应用程序的并行配置不正确
我的解决方法(release版本):
步骤一:项目属性-常规-MFC的使用 :在静态库中使用MFC
步骤二:项目属性-C/C++ -代码生成-运行时库:多线程/MT (debug版本是不是应该是/MTd呢?)
 
网上说的另一中方法(我没试):
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest
把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。
其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!
 
 
* 项目配置为“在静态库中使用MFC”,编译错误error RC2151
编译错误error RC2151 : cannot reuse string constants, 61446(0xF006)
我写程序很少发布过,都是写完了给领导同事,他把我的代码拷到他的工程上,去发布。最近发布个,编译的时候竟然出现了这样的错误
error RC2151 : cannot reuse string constants, 61446(0xF006) - "(##########,##########)" already defined. Cannot add 61446(0xF006) - "一未命名文件".
搜索了下,原来是是在发布的时候,使用Release版本,Static library编译时,MFC中afxres.h中61446已竟被使用,出现同一ID被两次使用。
所以,将自己写的那段资源ID改成比61446大些问题就解决了。
 
 
* nafxcwd.lib(afxmem.obj) : error LNK2005
(1)错误案例:在写日志程序中出现,工程是MFC程序(注:win32控制台应用程序,不会出现这种错误,当然是不支持MFC库的那种)
(2)错误原因:如下能看出一点眉目,重定义了.在使用***.obj时,已经在***.lib库中定义了.
摘抄:
上网搜了下,是CRT库与MFC库的冲突,解决方法是:让程序先链接Nafxcwd.lib,然后再链接Libcmtd.lib
you've got to change the order inwhich the libraries are linked. This is a bit tricky, since the library are linked automatically, without you explicitly specifying them.


So, first step, tell the linker to ignore the implicit libraries: Project/Setting/Linker, Input Tab, and put "Nafxcwd.lib Libcmtd.lib" in the "Libraries to Ignore" box.


Next, on the same page, in the Object/library Modules box, put the same to libraries. (in you still get the same error, try reversing them on this line)
可以从错误信息里看到,操作符new,delete,delete[]已经在LIBCMTD.lib中定义了,这跟C编译时使用的默认库与MFC运行时的默认编译库编译时链接顺序有关,我们可以手动的改变两个库的编译顺序就能解决这个定义冲突问题。
(3)错误现场:
1>正在链接...
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" () 已经在 LIBCMTD.lib(new.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" () 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" () 已经在 libcpmtd.lib(newaop.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" () 已经在 LIBCMTD.lib(delete2.obj) 中定义
1>C:\Documents and Settings\Administrator\桌面\多线程写日志怎样写\写日志1\Debug\写日志1.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
(4)错误解决办法:
中文
项目--属性 ---连接器---输入  
                              附加依赖项    空格Nafxcwd.lib Libcmtd.lib
                              忽略指定库    空格Nafxcwd.lib Libcmtd.lib
清除项目。重新编译。搞定
vc++6.0,vc++2008,vs2008的关系 VS是Visual Studio的缩写,VC++是Visual C++。Visual Studio 是一套完整的开发工具集,用于生成 ASP.NET Web 应用程序、XML Web Services、桌面应用程序和移动应用程序。Visual Basic、Visual C++、Visual C# 和 Visual J# 全都使用相同的集成开发环境 (IDE),利用此 IDE 可以共享工具且有助 阅读详情

相关推荐

VC6.0到VS2008升级项目

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

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

“初始化”: 截断常量值

(1)short i = 0x8000;//有警告:“初始化”: 截断常量值” (2)int j =  i;//无警告因为(1)0x8000是数字,数字默认是int型的,int的表示范围比short大 ,所以从int隐式转换 为short会警告截断 。如果改成显示转换 short i = (short)0x8000;则不会警告 。因为(2)中i为short型,从小范围 的short隐式转换为大范围 的int,不会截断,即使没有显示转换也不会有警告 ,而是用最高位补足不足的位 ,即正数补0

talentluke的专栏 1万+

VC6.0、VS2005、VS2008安装STLport-5.2.1

  今天为了装STLport,搞了很久,主要是新版本以致搞VC6.0时,有很多要注意的。前文:  下载STLport源代码,解压到一个目录,例如:C:/STLport-5.2.1。下面我都用 %STLport% 表示解压的完全路径。根据解压的不同,各位用自己的目录替换这里的 %STLport% 就是(有点罗嗦了)。VC6.0安装STLport-5.2.1:  1、首先在…/Microsoft Visual Studio/VC98/Bin/VCVARS32.BAT中, 把%STLport%/stlport;

whutxinriyue的专栏 4163

bug记录:常量值截断(truncation of constant value)

常量值截断

weixin_39488566的博客 1578

VS老项目迁移指南:如何用最新VS2022编译VC6到VS2008的遗留代码

本文提供了在Visual Studio 2022中编译VC6到VS2008等遗留代码的完整迁移指南。核心在于理解并使用正确的平台工具集,例如通过Daffodil工具集成V60到V90等旧版工具集。文章详细介绍了环境配置、项目升级、属性设置以及解决常见编译链接错误的实战步骤,帮助开发者在不重写代码的前提下,于现代IDE中维护历史项目。

weixin_27734811的博客 494

VC9、VC11、VC14、VC15是啥?

一:先看个关系对应 vs发布版本与vc版本对应关系如下所示: Visual Studio 6 : vc6 Visual Studio 2003 : vc7 Visual Studio 2005 : vc8 Visual Studio 2008 : vc9 Visual Studio 2010 : vc10 Visual Studio 2012 : vc11 Visual Studi...

yu_20170610的博客 1万+

VS编译遇到的问题

在VS中,有如下代码 char title[2]; title[0] = 0xEB; title[1] = 0x90; 生成解决方案时,出现了警告“warning C4309: “=”: 截断常量值”,这是因为0xEB默认为有符号int型, 解决方案是在后面加u,使其默认为无符号int型,警告消失 title[0] = 0xEBu; title[1] = 0x90u; ...

qq_36691249的博客 1287

3D识别建模 — 基于ReconstructMe和EAGLE EYES SCANNER的实现

3D实体识别建模,作为3D打印反向工程的一个重要环节,今天就让我们利用ReconstructMe和EAGLE EYES SCANNER来了解一下。 第一步、软件和硬件准备就绪 ReconstructMe下载并安装 http://reconstructme.net/?wpdmdl=160 EAGLE EYES SCANNER直接将相应USB插入电脑接口即OK,之后在    中点击搜索“设备管理...

qq_40013290的博客 881

c++ “初始化”: 截断常量值

添加unsigned关键字即可。

一个草根敲键盘的故事 1455

基于Landsat-8数据的山西省吕梁市地表温度反演研究过程(大气校正法)

1.数据下载:本实验采用的数据是 ①从地理空间数据云下载的来自landsat8 卫星,云量<=1%,时间为2017年5月12日的山西省吕梁市影像数据。为全面覆盖吕梁市,选用了两片影像。 ②吕梁市边界矢量图 2.数据预处理 ...

weixin_45747376的博客 6601

Mplus实战:如何用交叉滞后面板模型(CLPM)分析心理学纵向数据?

本文提供了在Mplus软件中应用交叉滞后面板模型(CLPM)分析心理学纵向数据的实战指南。文章详细拆解了CLPM的核心概念、Mplus语法框架,并涵盖从基础的两变量模型到多变量、潜变量建模的扩展,以及结果解读与常见陷阱规避,旨在帮助研究者利用这一经典工具有效探索变量间的动态预测关系。

weixin_29253711的博客 405

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

移植 升级 VC6.0 VS2008

JuanA1的专栏 8223

简易背单词系统C/C++

#include&lt;stdio.h&gt; #include&lt;string.h&gt; int F=20,N=100,k=0; int score[100]; int count=0; void hello(); void add(); void preview(); void mdelete(); void etc(); void cte(); void mscore(); void...

青木年华 9154

vc6.0移植到vs2008下问题总结

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

王教余的专栏 1303

ZYNQ Linux下UIO中断配置避坑实录:从设备树修改到用户层测试(Vivado 2018.2)

本文详细解析了ZYNQ Linux下UIO中断配置的全流程,从设备树修改到用户层测试,特别针对Vivado 2018.2环境中的常见陷阱提供解决方案。内容涵盖中断号配置规则、用户空间中断处理程序编写以及性能优化技巧,帮助开发者高效实现硬件中断的用户空间控制。

weixin_31854867的博客 334

画了多年板子才搞懂:Allegro内电层负片连接,Thermal Relief和Anti-Pad避坑全解析

本文深入解析Allegro内电层设计中Thermal Relief与Anti-Pad的关键技术要点,帮助工程师避免常见设计陷阱。通过六层板实战案例,详细阐述负片连接逻辑、热风焊盘参数设计及隔离盘优化策略,提升PCB设计的可靠性与EMI性能。

weixin_28731223的博客 265

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

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

cl52155的专栏 765

[网络安全提高篇] 一一九.恶意软件动态分析经典沙箱Cape的安装和基础用法详解

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文详细介绍恶意代码静态分析经典工具Capa的基础用法,以及批量提取静态特征和ATT&CK技战术,主要是从提取的静态特征Json文件中提取关键特征。这篇文章将详细讲解动态分析沙箱Cape,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。本文先介绍Cape沙箱的安装和基础用法,后续随着深入再分享。基础性文章,希望对您有帮助!

杨秀璋的专栏 1万+

VC6 VS VS2008

有这样一段程序:/****************************************************     09/8/27       by  Jack Lee****************************************************/#include void main(){   int i,a[10]; for(i=0;i {  a

likejieicy 522

yolov8 PTQ和QAT量化实战(源码详解)

量化():是指将高精度浮点数(FP32)转换为低精度(8bit或4bit)整数的过程,它是模型部署中的一种非常重要的优化方法,可以在较少的精度损失下,大幅提供神经网络的效率和性能。目前主流的神经网络量化方式有PTQ和QATPTQ是训练后量化(),无需数据集和训练,直接量化模型权重QAT是量化感知训练(),量化后需要在数据集上继续微调训练。QAT过程中,我们首先需要选择哪些层需要进行finetune训练,并利用FP32对应层的输出作为监督进行训练。

@bangbang的博客 5328

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC6项目升级到VS2008,原有项目中for循环变量的修改

由于VS2008更加符合C++标准, 如在VC6中,在FOR循环中的循环变量的定义的作用域延伸到循环体外, VS2008则修正了这样的bug,只作用在循环体内,所以     VC6:     for(int i=0; i     {            fun2()

jfx的专栏 1287

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从vc6.0转到vs2008出现的错误

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

oyanghaizhi的专栏 886

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC6.0和VS2008的OpenGL环境配置

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

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

VS2008与VC6.0的变化

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

jfx的专栏 1147

winpcap编程环境搭建:VC6.0 and VS2008

VC6.0下winpcap编程环境搭建:1. 到http://www.winpcap.org/devel.htm 下载WinPcap的安装包(WinPcap.exe)和 WinPcap的Developer's Pack(WpdPack.zip)。   PS:如果你的VC6.0的SDK不是最新的,       请下载4.0.1版本的WinPcap的安装包和Developer's Pack(经测试,该版本在“旧”的VC6.0中可用),       因为太高版本的会编译不过。   PPS:当然,你也可以先更新你的

Y's Blog 3181
上一篇: 汉字高地位字节判断
下一篇: Kernel Function
QuiSuis-Je
博客等级 码龄18年 334粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值