panfanggui 发表于 2013-11-25 16:32:06

使用VS2010配合多平台工具集开发ARX14~2012CAD程序的注意事项

本帖最后由 panfanggui 于 2015-10-6 13:54 编辑

使用VS2010配合多平台工具集开发ARX14~2012CAD程序的注意事项对于计算机上已安装了VS6.0、 VS7.0、VS8.0、VS9.0的,只要在网站http://daffodil.codeplex.com/ 下载Daffodil for Visual Studio - Native Multitargeting Platform Toolsets.(多平台工具集)安装即可,否则需找VS6.0、 VS7.0、VS8.0、VS9.0拷贝到机子上,同时需对他们在注册表注册,以便VS2010通过注册表找到他们的安装位置,并用安装路径填充下面两个变量:$(VCInstallDir)及$(VSInstallDir)。$(VCInstallDir)代表VC安装目录,$(VSInstallDir)代表VS安装目录。对于VS6.0 ,$(VCInstallDir)=盘符:\安装目录\Microsoft Visual Studio\VC98; $(VSInstallDir)= 盘符:\安装目录\Microsoft Visual Studio\Common对于VS7.0 ,$(VCInstallDir)=盘符:\安装目录\Microsoft Visual Studio .NET\VC7; $(VSInstallDir)= 盘符:\安装目录\Microsoft Visual Studio .NET对于VS8.0 ,$(VCInstallDir)=盘符:\安装目录\Microsoft Visual Studio 8\VC; $(VSInstallDir)= 盘符:\安装目录\Microsoft Visual Studio 8对于VS9.0 ,$(VCInstallDir)=盘符:\安装目录\Microsoft Visual Studio 9.0\VC; $(VSInstallDir)= 盘符:\安装目录\Microsoft Visual Studio 9.0根据在VS2010中选择的不同平台工具,VS2010从注册表中读取平台的VC及VS安装目录填充$(VCInstallDir)及$(VSInstallDir)。对于VS6.0,VC安装目录为注册表:"ProductDir"串中的值。VS安装目录为注册表:"VsCommonDir"串中的值对于VS7.0、VS8.0、VS9.0 ,VC安装目录为注册表: "ProductDir"串中的值.VS安装目录为注册表: "ProductDir"串中的值.    清楚了这样的关系,就可以任意放置拷贝来的VS6.0、 VS7.0、VS8.0、VS9.0位置了,自己写注册表文件(可参照VS2010的注册表键)。但注意不能改变其中子目录的相对关系。在另一台未安装低版本的VS上拷贝低版本VS,安装了多平台工具集后同样可使用。目前已把一R14版的arx程序修改后用VS2010配合多平台工具编译成CAD14~2012版程序。改变并不顺利,经过上网查阅资料最终完成,将这一过程的注意事项记录如下。一、关于字符串AutoCAD2007起,已采用宽字节字符集(Unicode)编码,之前的版本采用多字节字符集(MBCS)编码,因此必需改写为Unicode和MBCS兼容的代码。为编制兼容Unicode和MBCS的代码,微软已在tchar.h文件中定义了兼容Unicode和MBCS的数据类型及函数(主要为字符数据及字符处理函数)。char型字符串、char*、恒量字符串及与之相关的字符串函数均要采用tchar.h头文件中定义的类型代替。打开该文件就知道怎样使用。该文件中定义的数据类型及函数是可变的,根据宏UNICODE或_UNICODE是否定义来确定采用宽字节字符集(Unicode)版类型及函数,还是采用多字节字符集(MBCS)版数据类型及函数。具体来说就是char〔〕、char* 用TCHAR〔〕、TCHAR*代替,恒量字符串“adfg”代替为_T(“adfg”),至于字符串函数要根据使用情况来定,如原str开头的函数str换为_tcs开头。二、关于文件操作1、_ftscanf(fp,_T("%d%s%s"),&key,tam,yxm)读取文件操作函数已改成tchar.h文件中定义的适用于两套字符编码的函数,但在UNICODE编码取得的字符显示为乱码。解决的方法是:需在使用前进行区域设定,使用后恢复原来的区域设定。FILE * fp;TCHAR yxm;TCHAR tam;int key;TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE,NULL));_tsetlocale( LC_CTYPE, _T("chs") );//区域设定,很重要,否则_ftscanf的UNICODE版fwscanf不能处理中文字符,为乱码if((fp=_tfopen(tlbwj,_T("r")))==NULL) //open 岩性图例表文件{ads_alert(_T("无图例列表文件"));return 0;}while(!feof(fp))             //在UNICODE编码下用_TEOF不能判断文件结尾,在MBCS下可以。      {      _ftscanf(fp,_T("%d%s%s"),&key,tam,yxm);      if(appendlst(tam,yxm,key,lp)==0)         //将图例表文件装入内存链表            {             ads_alert(_T("将图例列表装入链表失败"));                  return 0;         }      }       fclose(fp);          _tsetlocale( LC_CTYPE, old_locale ); //还原区域设定2、if(_ftscanf(fp, _T("%d%s%s"),&key,tam,yxm)==_TEOF) 在UNICODE编码下用_TEOF不能判断文件结尾,在MBCS下可以。采用判断是否到文件结尾的函数feof(fp)来解决。具体原因不清楚。    解决文件读写问题,上网查找资料用了较长时间。三、关于内存分配函数malloclst->data=(char *)malloc(strlen(s)+1),在MBCS编码情况下,一个字符是1字节,一个汉字为2个字符,也就是2个字节,此情况下上面的语句没有问题,但在UNICODE编码下,每个字符(包括英文字母,一个汉字为1个字符)占2字节,因此需修改如下:lst->data=(TCHAR *)malloc(_tcslen(s)*sizeof(TCHAR)+sizeof(TCHAR))作这样的修改用了较长时间,应是原来的代码考虑不周。四、其它问题   Cad的ARXA程序一般由两部分构成,其中一部分程序的扩展名为.dbx(也可为arx,dll),.dbx向arx输出类,如果一个工程中包括了这两个项目,且arx项目依赖dbx项目,对于vc7,不需要在arx项目连接器的输入中显示地加入dbx项目的链接库文件(.lib),根据依赖关系自行确定(不知对否?),而对于VS2010必需要显示地加入dbx项目的链接库文件(.lib),否则将在arx项目的链接时显示输出类的成员函数均为无法识别的外部符号。为查找该问题的原因,采用将该项目的VS7.0的链接器命令行全部拷贝至VS2010链接器命令行后执行比较后才发现了问题。

flyfox1047 发表于 2013-11-25 21:41:09

楼主,搞个介绍吧

lubing 发表于 2014-2-23 16:02:53

是什么???

前生 发表于 2015-2-24 22:57:16

神秘的很,看看是什么?

awd37 发表于 2015-5-30 23:45:55

问啥收币啊

xyz002 发表于 2015-9-2 15:28:09

最好有个介绍

vlisp2012 发表于 2015-9-22 19:40:13

2013年的主题,该解禁了吧

vladimirputin 发表于 2016-11-1 16:42:51

不错的程序,谢谢楼主分享啊。
页: [1]
查看完整版本: 使用VS2010配合多平台工具集开发ARX14~2012CAD程序的注意事项