找回密码
 注册会员

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 229|回复: 0

AutoCAD二次开发程序的自动安装处理

[复制链接]
发表于 2011-6-18 09:25:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转磨削论坛

您需要 登录 才可以下载或查看,没有账号?注册会员

×
AutoCAD的二次开发主要涉及以下内容:(1)编写各种用户自定义函数并形成若干LISP、ARX、VLX或ADS文件,以及一些DCL文件。(2)建立符合自己要求的菜单文件,一般可在AutoCAD原菜单文件内添加自己的内容,对于AutoCAD2000版本还可增加部分菜单文件,然后经交互方式加入到系统中去。(3)在系统的ACAD.LSP或类似文件中加入某些内容以便进行各种初始化操作,如在启动时立即装入一些文件等。(4)通过系统对话框设置某些路径。这些操作在程序开发成功后向其它AutoCAD系统上安装应用,特别是需要大批安装时,需要进行很多文件检索、内容增删、子目录创建、文件拷贝、系统设置等繁琐工作,如能令上述工作全部自动进行,使整个二次开发程序在无人干预的情况下嵌入系统,将大大提高工作效率。为此笔者用VC++开发了一套自动安装程序,使原本需要五、六分钟的人工操作在十几秒内即可自动完成。
! t) t2 `5 b3 y( V( v一、基本思路
2 W% U- M) l$ L. X0 w0 H整个安装程序遵循以下思路:8 Y+ I9 A% L- y0 j2 E
1) 首先获得所在机器AutoCAD2000系统的安装路径;
* f! b+ s/ l% ^; T2) 寻找菜单文件AutoCAD2000\\support\\acad.mnu,打开文件并将要添加的内容加至末尾;
" c" Z) n$ i7 ]3 ]4 D2 F3) 寻找LISP文件AutoCAD2000\\support\\acad2000doc.lsp,打开文件并将要添加的内容加至末尾;
+ @( W$ ]! p. o; \; _8 T4) 创建一个预先命名的子目录,将所有二次开发形成的各类文件拷入;
4 @4 D1 d  h6 J, h$ M5 m4 a7 {5) 给出信息框,告知安装成功,如有问题则告知安装失败。0 l1 q6 N0 J/ Z+ G+ y4 p/ U
需要指出的是,在添入acad2000doc.lsp的内容中须有如下语句:/ u6 b( h' @* _9 S
(command“_menu”(strcat (getvar "menuname") ".mnu")),目的是为了强制执行菜单文件装入命令,将改动后的acad.mnu文件编译后装入。
: t) S0 c" o; _( b" q! c2 D另外,在添入acad2000doc.lsp的内容中还有一赋值语句,将准备创建的包含所有二次开发生成文件的子目录全路径名赋予一全局变量,以供二次开发程序在需要时调用,从而避免了在AutoCAD环境下交互设定路径的麻烦。
1 b% `6 b; Q5 J% T境下交互设定路径的麻烦。- O0 G, u1 f. Y3 Y9 d- Q/ M
二、实现方式及关键函数
; i+ S2 R0 g# N) `. }9 E* V2 n为获得AutoCAD2000的安装路径,需要利用WINDOWS系统注册表的有关功能。
7 k% u1 g: }* a, V3 R* V首先通过RegOpenKey函数打开注册表:' {' ]5 A+ e# _% C& m
HKEY hKey;
4 N$ E% H( @( N: @  VLONGret=RegOpenKey( HKEY_LOCAL_MACHINE, "Software\\Autodesk\\AutoCAD\\R14.0\\ACAD-1:804", &hKey);6 k/ G3 f3 C8 S6 \# P
其中第一参数HKEY_LOCAL-MACHINE为注册表中预定义的主键句柄,第二参数为注册表中HKEY_LOCAL_MACHINE下的子键内容,第三参数hKey将返回一子键句柄,用于接下来的键值查询。若该函数运行成功,将返回一长整型数ERROR_SUCCESS。/ b: U4 s9 ?' o" m: G1 N$ c
接下来利用RegQueryValueEx函数进行键值查询:
5 {, p6 R! G# C0 H8 S- ^8 f" BDWORD dwType=REG_SZ;
3 `# @5 }( _+ M, BBYTE szData[100];
5 Q5 _# E- x% JDWORD dwSize=sizeof(szData);
. _! k' d8 Q2 n, W' }If (ret=ERROR_SUCCESS)( Q" f! C. K# n) V
ret=RegQueryValueEx(hKey, "AcadLocation", 0, &dwType, szData, &dwSize);
5 t+ k5 }( s! S, c其中第一参数hKey为由RegOpenKey函数获得的欲查询的子键句柄;第二参数“AcadLocation”为欲查询的键值名;第三参数为保留项,要求添0;第四参数为键值数据类型;第六参数为键值缓冲器容量;最关键的是第五参数szData,欲查询的键值结果将由其带回,该键值即为所需要的AutoCAD2000的安装路径。" S. C7 K7 a5 j8 s% J9 m% f3 }
以上涉及到的有关注册表中主键、子键、键值名、及键值的关系可通过下列方法由WINDOWS系列注册表查出:单击“开始”--“运行”--添入“regedit”--“确定”--“HKEY_LOCAL_MACHINE”--“Software”--“Autodesk”--“Autocad”--“R15.0”--“ACAD-1:804”--“AcadLocation”--“e:\autocad2000”。其中的键值名“AcadLocation”所对应的键值为“e:\autocad2000”,就是AutoCAD2000的安装路径,在不同的机器上可能内容不同。
0 n! t% z% d, P, F: Z" y" V0 J键值查询函数若运行成功,将返回长整型数ERROR_SUCCESS。
) H1 r  W& T7 P0 j6 X+ j& ~( s9 |. N& j; M0 K  K
char szRootName[100]=\\support\\acad.mnu;
1 ~, C6 P  t0 P3 K1 x4 h3 ^if (ret=ERROR_SUCCESS)
/ }. z) m9 ]5 E1strcat((char*) szData, szRootName);6 z. ^( J3 {3 ~
现在szData中装有acad.mnu的全路径,以下操作将打开该文件并添入内容:
, P) a. J  I" L8 GHANDLE hfile=CreateFile((char*) szData, GENERIC_READ|GENERIC_WRITE, 0,
* o/ [+ @: M2 H+ W9 c7 w* ANULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
! T4 A5 R5 i% c5 }+ x, xIf(hfile!=INVALID_HANDLE_VALUE)
: r; V  y) x$ H$ c0 G& j6 W6 ?{* c8 G  _' a* ^8 c
if (0xFFFFFFFF!=SetFilePointer(hfile, 0, NULL, FILE_END)); Y' v- T! B4 h/ Q. N
{
5 n/ A( k1 b; D. U* |3 k, }' l* Z9 R, Y! E  o
char szBuf[1000]="\n***POP12\n**CAM\n[&CAM]\n[->基本参数]\n[卡盘原点]^c^cchuck_datam\n[换刀原点] ^c^ctool_datam\n[刀具管理]\n《创建新刀》 ^c^ccreate_new_tool\n[
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

中国磨床技术论坛
论 坛 声 明 郑重声明:本论坛属技术交流,非盈利性论坛。本论坛言论纯属发表者个人意见,与“中国磨削技术论坛”立场无关。 涉及政治言论一律删除,请所有会员注意.论坛资源由会员从网上收集整理所得,版权属于原作者. 论坛所有资源是进行学习和科研测试之用,请在下载后24小时删除, 本站出于学习和科研的目的进行交流和讨论,如有侵犯原作者的版权, 请来信告知,我们将立即做出整改,并给予相应的答复,谢谢合作!

中国磨削网

QQ|Archiver|手机版|小黑屋|磨削技术网 ( 苏ICP备12056899号-1 )

GMT+8, 2025-5-17 09:32 , Processed in 0.133658 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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