C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”

映泰TB250-BTC主板魔改BIOS支持8/9代CPU实战与开机故障排查 BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,负责初始化硬件和提供运行时服务。其工作原理是通过存储在主板芯片中的固件程序,在上电自检(POST)阶段完成对CPU、内存等关键组件的检测与配置。魔改BIOS的技术价值在于突破硬件限制,通过修改微码和电源管理模块,让旧平台支持新处理器,从而以极低成本实现性能跃升,在预算有限或追求极致性价比的DIY、办公和软路由等应用场景中极具吸引力。本文以映泰TB250-BTC矿板为例,详细解析了通过软刷方式刷入魔改BIOS,并重点解决了刷写后常见的“开机风扇转一 阅读详情

其实还可能出现其它类似的问题,如:

error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”

error C2039: “strcpy”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员

但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBCS编码,即多字节字符;而VC8、VC7默认的是Unicode编码,所以...

关于这两种编码有何不同,我引用了网上的一篇文章,由于作者匿名,只能在此感谢:

http://pc.nengbang.cn/group_thread/view/id-2603

在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。

VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。

要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE)

如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。

为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。

类型

一般文本 数据类型名称 _UNICODE 和 _MBCS 未定义 _MBCS 已定义 _UNICODE 已定义

_TCHAR char char wchar_t 
_TINT int int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t 
_T 或 _TEXT 无效(由预处理器移除)无效(由预处理器移除)L(将后面的字符或字符串转换成相应的 Unicode 形式)

CRT中的相关函数在Tchar.h中都定义了相应的替代,基本是将str换成了_tcs,比如:CRT中的unsigned int strlen(const char *)现在是unsigned int _tcslen(const TCHAR*),在Uniocde时,将被替换为unsigned int _wcslen(const wchar_t)*,而在MBCS时,会被替换为unsigned int _mcslen(const char*)。

看,写Unicode和MBCS兼容的代码挺容易的吧,我总结了一些替换规则

1 将char换成TCHAR (unsigned char必须去掉unsigned)

2 将str函数换成_tcs函数

3 将字符串常量定义加要_T("")宏

4 printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型

很多时候程序中既需要Unicode,又需要使用ASCII,这时需要用到操作系统的2个API

WideCharToMultiByte用来将Unicode字符串转化为MBCS的

MultiByteToWideChar用来将MBCS字符串转化为Unicode的

一些注意事项:

在Unicode编码下,sizeof没那么可靠了,memset( 0 sizeof())的习惯用法可能会出大错,改成memset(0sizeof()/szieof(TCHAR))就没事了,呵呵

在Unicode下,一个中文字符就是一个字符,len = strlen() / 2;这样可不行了

用VC6进行UNICODE编程

最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。

1. 添加 UNICODE 和 _UNICODE 预处理定义

位置:Project Settings -> C/C++ -> Preprocessor definitions

添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)

2. 使用宽字符相关类型,如:

char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR

3. 对字符串常量使用 _T() 宏

4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等

类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等

5. 将 Project Settings -> link -> Output -> Entry Point 设为 wWinMainCRTSTartup

否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本

可在StdAfx.h中:

#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif

然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等

7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:

CString s = _T("ABC");
ASSERT(s[0] == 'A');

8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用 MultiByteToWideChar 和 WideCharToMultiByte

uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端 uni-app-在纯JS文件中调用自定义弹框组件/封装全局API调用弹框组件(解决小程序、APP无法使用document.body.appendChild插入组件节点)适配全端,uni-appappendChild怎么向小程序中插入节点,如何开发类似uni.showModal全局组件。h5端可以通过document.body.appendChild挂载,请问app跟微信小程序怎么弄,请问uniapp如何封装全局api调用弹窗组件?uniapp怎么设置所有页面共用的组件Uni 阅读详情

相关推荐

Neo4j桌面版导入CVS文件

我们的relation.csv是这样的。

m0_53573725的博客 817

C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”...

其实还可能出现其它类似的问题,如: error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” error C2039: “strcpy”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员 但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBC...

weixin_30414245的博客 461

DMA+Timer 生成 PWM 波形错位问题分析与解决

本文深入分析了DMA与Timer协同生成PWM波形时出现的错位问题,揭示了DMA传输启动时机与定时器溢出中断的微妙关系。通过占空比强制清零法和预装载值调校技巧,提供了有效的解决方案,并总结了PWM+DMA配置的最佳实践,帮助开发者避免类似问题。

weixin_29191081的博客 348

error C2664: “fopen”: 不能将参数 1 从“const char [ ]”转换为“const wchar_t

CString str; str.Format("Amount Remaining $ %.2f", m_Amt_Remaining);), 上VC6中上述代码没有问题,但在Visual stdio 2008中编译中有错误: 错误提示: error C2664: “void ATL::CStringT::Format(const wchar_t *,...)”: 不能将参数

心静如水 5850

OneOS远程升级能力实操演示 | OTA升级

OneOS远程升级能力实操演示,差分算法提升效率,OTA升级,OTA差分算法,全量升级、压缩升级、差分升级,有线网络连接,bootloader,升级平台,在线差分包制作,触摸屏以及GUI图形操作

OneOS是中国移动针对物联网领域推出的轻量级操作系统 2011

半导体制造中的通孔缺陷与冗余通孔技术解析

通孔(Via)是半导体制造中连接不同金属层的关键结构,其可靠性直接影响芯片良率。随着工艺节点演进至28nm及更先进制程,通孔缺陷导致的良率损失日益显著,主要表现为完全开路和高阻态两种失效模式。冗余通孔技术通过在关键位置增加备用连接,可有效提升芯片可靠性,其实现涉及物理冗余与电气冗余两种方案。该技术在7nm/5nm工艺中已证明可将通孔相关缺陷率降低10-100倍,但面临设计规则复杂性、规模处理效率和动态合规验证等工业化挑战。智能双切通孔插入流程通过动态DRC规则解析、奇偶层级并行处理和增量式验证等创新方法,显

weixin_35982453的博客 383

error C2664:不能将参数 1 从“CString”转换为“const char *”

我在VC的unicode项目中使用如下代码时,提示错误“error C2664: "gethostbyname": 不能将参数 1 从"CString"转换为"const char *"”。 CString host; lpHost = gethostbyname(host); 最快的解决办法: Since this function requires An

gongfuxiaozi11的专栏 4705

Unity物理驱动3D汽车实现:从刚体控制到参数调优

在游戏开发中,刚体物理是实现真实物体运动与交互的核心技术。通过Unity的物理引擎,开发者可以模拟重力、碰撞、摩擦力等物理行为,为游戏世界注入真实感。其技术价值在于能够以符合物理规律的方式驱动游戏对象,避免穿墙、无视惯性等问题,从而提升游戏体验的真实性和沉浸感。这一原理广泛应用于角色控制、车辆模拟、物体破坏等场景。本文以3D小汽车为例,详细解析了如何通过Rigidbody组件施加力与扭矩,并利用C#脚本实现玩家输入逻辑,完成一辆可操控、能碰撞的物理驱动汽车。文中重点探讨了AddForce与角速度控制两种方案

weixin_34380948的博客 501

DeerFlow 系列教程 附录 | 核心文件索引、官方文档索引与推荐阅读顺序

DeerFlow 系列教程 附录本附录汇集了 DeerFlow 项目的核心文件索引、官方文档索引和推荐阅读顺序三份速查资料,方便读者在日常开发和学习中快速定位关键代码与文档。内容按实际项目目录结构整理,所有路径均基于 DeerFlow 2.0 版本验证。

weixin_43674738的博客 328

【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

大家好,我是阿光。本专栏整理了《深度学习100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。正在更新中~ ✨。

优快云 精品推荐 10万+

VS2013常见错误:error C4996: 'fopen' 以及 error C4996:无法将参数 1 从“LPCTSTR”转换为“const char *

这两个错误在c++ 项目中灰常常见了,修改项目属性就可以得到解决。 (1)错误 10    error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See o...

qq_22227123的博客 643

yandex 不定长旋转验证码PPOCR识别案例

可以看到,此种验证码非常变态,旋转角度不固定,干扰背景不固定,字符长度不固定,弯曲形变都是不固定的,在人眼都很难分辨验证码的情况下,其实都是对于模型来讲,也是比较困难的哈哈,传统验证码可能小几百张就能达到很好的效果了,是因为,验证码难度比较简单,通常都是4,6位定长,但是对于模型而言,无非就是增加数据量。由于该验证码的复杂度,自己写一个rcnn或者其他模型,来优化改数据集进行训练变的尤为困难复杂,所以这里强烈推荐百度飞桨的开源模型。在得到较好的loss后,导出模型。如有侵犯,请联系作者下架。

码王吴彦祖的博客 723

C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” from http://www.cnblogs.c...

其实还可能出现其它类似的问题,如: error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” error C2039: “strcpy”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员 但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBC...

weixin_30800807的博客 106

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”

<br />其实还可能出现其它类似的问题,如:<br />error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”<br />error C2039: “strcpy”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员<br />但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBCS编码,即多字节字符;而VC8、VC7默认的是Unicode编码,所以...<br />关于这两种

eva1988725的专栏 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

关于“不能将参数1 从“CString”转换为“const char *””的一些思考

MFC开发时经常会遇到CString、string/std::string、char*等类型相互转换的问题,现将一些思考与心得记下来与大家分享:    ①CString强制类型转换为const char*,在变量前加上:(char *)(LPCTSTR),这样做虽不会报错,但

Pc620的专栏 9708

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题

CString csNewListBoxText; CString csOldListBoxText(g_csFirstListBoxSelText); if(strcmp(csNewListBoxText,csOldListBoxText)!=0) //Release版本下出错情况: //error C2664: “strcmp”: 不能将参数1 ,2从“CString”转换为“cons

MOKA 1281

不能将参数 1 从“CString”转换为“const char *”

你在vs2008中默认字符集是UNICODE字符集,CString中字符以wchar_t的形式来存储的,而不是char。你在项目-》属性-》配置属性 有一个字符集,可以改字符集,改成多字节字符集就行了。 我在VC的unicode项目中使用如下代码时,提示错误“error C2664: "gethostbyname": 不能将参数 1 从"CString"转换为"const char *"”

Woosa 3224

CString”转换为“const char *

在VS中有时候会遇到类似错误: error C2664: “fopen_s”: 不能将参数 2 从“CString”转换为“const char *” 这是我们可以强制转换CString: (LPSTR)(LPCTSTR)str 为什么会出现这种错误呢?我们打开菜单中的“项目/项目属性/配置属性/常规“, 可以看到常规中的字符集为”使用Unicode字符集“,原因就在这里。 有两种方法

fionachen33的专栏 762

error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *"

Cstring转int型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”)) 2011-11-24 22:20 在vc6.0下用CString str;num = atoi(str);就可以顺利取到num; 但是同样代码拿到vs2008就报错,error C2664: “atoi”: 不能将参数 1 从

xiaocao9903的专栏 4787
上一篇: VC6.0 转 VS2005
下一篇: VC6到VS2005中的转换
fly_902
博客等级 码龄20年 12粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值