找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4839|回复: 2

VC++两个经典问题解决方案

[复制链接]
发表于 2008-10-23 10:01:47 | 显示全部楼层 |阅读模式
1.本机编译好的程序无法在没有装VC的机子上运行
由于VC++2005默认采用动态链接运行时库,导致编译好的程序在运行时依赖于本机的运行时库,当然移植到别的机子上就不能运行了。
对于一般的win32控制台程序,可以这样设置:
点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "C/C++"--- "代码生成",将此页面右边的 "运行时库"由默认的 "多线程DLL(/MD)"改为 "多线程(/MT)"或 "多线程调试(/MTD)"即可。      
不过一般情况下生成release版本的应用程序时选 "多线程(/MT) "即可,因为这样生成的exe程序较小。      
而如果选了 "多线程调试(/MTD) ",则由于加入了大量的调试信息而使生成的exe程序会增大好几倍。(project ->XXX property page ->configuration properties ->C/C++ ->Code Generation ->Runtime Lib.)
对于MFC程序,则点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "常规",将右边"项目默认值"栏目中的"MFC的使用"改为"在静态库中使用 MFC"。确定后,在"配置属性"--- "C/C++"--- "代码生成"页面的"运行时库"会自动改为静态链接----即"多线程(/MT)"。这样编译出来的程序就可以在没有装VC的机子上运行了。
2.在VC++ 2005中fstream对象无法访问中文路径下的文件,包括英文路径下的中文名文件。
在用ifstream和ofstream打开文件前设置全局locale为本地环境,打开文件后再设置回去。                           

     ofstream writefile;
   
string filename=("d:\我的文档\测试.txt");
     locale loc
= locale::global(locale("")); //要打开的文件路径含中文,设置全局locale为本地环境
     writefile.open(filename.c_str(),ios::out); //打开文件
     locale::
global(loc);//恢复全局locale

用locale对象的name方法可以看到,通过locale("")构造出的locale对象的name为"Chinese_People's Republic of China.936",而原始的locale对象的name为"C",也就是缺省的ANSI_C公约。
注意:如果使用locale loc = locale::global(locale(""))设置全局locale后没有用 locale::global(loc)恢复的话,那么在程序后面的cout语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
发表于 2008-10-23 10:55:39 | 显示全部楼层
这两个问题都遇到过。
其中2我是用了MultiByteToWideChar()把char*转为w_char*。fstream有一个重载的接受w_char*的版本。
 楼主| 发表于 2009-2-22 00:38:50 | 显示全部楼层
微软的VS2005和2008引入的这套解决方案非常的垃圾,纯粹是SB想出来的。因为它解决了一个问题,带来了10个问题。日。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 19:48 , Processed in 0.012414 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表