明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3067|回复: 7

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

[复制链接]
发表于 2013-11-25 16:32 | 显示全部楼层 |阅读模式
本帖最后由 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安装目录为注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevStudio\6.0\Products\Microsoft Visual C++]"ProductDir"串中的值。
VS安装目录为注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\Setup]"VsCommonDir"串中的值
对于VS7.0、VS8.0、VS9.0 ,VC安装目录为注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0(或8.0、9.0)\Setup\VC] "ProductDir"串中的值.
VS安装目录为注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0(或8.0、9.0)\Setup\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[100];
  TCHAR tam[50];
  int key;
TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE,NULL));
  _tsetlocale( LC_CTYPE, _T("chs") );//区域设定,很重要,否则_ftscanfUNICODEfwscanf不能处理中文字符,为乱码
  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)来解决。具体原因不清楚。
    解决文件读写问题,上网查找资料用了较长时间。
三、关于内存分配函数malloc
lst->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链接器命令行后执行比较后才发现了问题。
发表于 2013-11-25 21:41 | 显示全部楼层
楼主,搞个介绍吧
发表于 2014-2-23 16:02 | 显示全部楼层
是什么???
发表于 2015-2-24 22:57 | 显示全部楼层
神秘的很,看看是什么?
发表于 2015-5-30 23:45 | 显示全部楼层
问啥收币啊
发表于 2015-9-2 15:28 | 显示全部楼层
最好有个介绍
发表于 2015-9-22 19:40 | 显示全部楼层
2013年的主题,该解禁了吧
发表于 2016-11-1 16:42 | 显示全部楼层
不错的程序,谢谢楼主分享啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-25 18:12 , Processed in 1.137937 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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