找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3645|回复: 8

[原创]:谈一下XD工具箱安装程序的制作

  [复制链接]
发表于 2003-7-13 21:36:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
(我慢慢写,一次写不完下次接着写)

安装程序的制作工具很多,但由于二次开发程序与AutoCAD关系的特殊性,因此,写一个能够自动安装Autolisp程序的安装程序,并不是所有的安装程序制作工具都胜任的。

一个可以编写脚本,有一定的可编程能力的安装制作程序可以符合要求,比如InstallShield, Wise, 等等。我的选择有些特殊,我选用了Inno Setup 4。原因有两个:
1.我对Pascal语言比较偏爱,这个安装制作工具正是使用的Pascal脚本。这是一个使用Pascal语言写的Pascal编译器。
2.这是一个免费的自由的软件,可以自由地得到整个安装制作工具的源代码。

Inno Setup是一个很小的软件,界面不象installshiled, wise那样豪华、方便。它仅仅是个文本编辑器和编译器。
(说明:inno setup支持pascal可编程并不完全是inno setup的作者作出的贡献,与inno setup extension, innerfuse pascal有关,有兴趣了解的朋友可以用google搜索这些关键词,这里不细谈)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2003-7-13 22:01:30 | 显示全部楼层
关于inno setup的使用教程,有兴趣的人大可自己去看其自带的帮助文件或者订阅inno setup的讨论组。

我这里仅仅提一下大致的思路。首先,因为XD工具箱不是一个大型的软件,只是一个小工具,所以,决定就象Bonus/Express那样,加个菜单和几个工具条上去,不用象天正理正那样的大系统,需要完全创建自己的profile。方向定下来了,附件是XD工具箱0.28安装程序的脚本,纯文本文件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-13 22:11:09 | 显示全部楼层

判断系统中有没有安装AutoCAD

这个脚本中的做法是测试注册表HKLM\Software\Autodesk\AutoCAD键是否存在。当然,也有其它方法。

innosetup 脚本如下, 当然wise, is中都有判定某键是否存在的函数。

  1. [FONT=courier new]
  2. const
  3.   AutoCADKey = 'Software\Autodesk\AutoCAD';

  4. function AutoCADInstalled: boolean;
  5. begin
  6.   Result:=RegKeyExists(HKLM, AutoCADKey);
  7. end;
  8. [/FONT]
复制代码


在安装程序初始化的时候调用这个函数测试, 不存在的话退出安装程序,提示用户AutoCAD没有安装:

  1. [FONT=courier new]
  2. function InitializeSetup(): Boolean;
  3. var mresult: integer;
  4. begin
  5.   result := true;
  6.   if not AutoCADInstalled then
  7.   begin
  8.     MsgBox('您的系统中没有安装AutoCAD。本程序是运行在AutoCAD平台上的,所以不能安装。', mbError, MB_OK);
  9.     result := false;
  10.   end;
  11. ......
  12. end;
  13. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-13 22:23:33 | 显示全部楼层

判断AutoCAD是否正在运行

做这个判断对我来说费了一番手脚。想用WindowsAPI来FindWindow, 可autoCAD软件的标题栏的文本不定,它的类名我用WinSight查看居然也是动态的,一时麻烦起来。

因为安装程序需要修改注册表,如果在AutoCAD运行的时候修改,当AutoCAD关闭时会恢复原值,白改了。所以需要保证安装的时候AutoCAD是退出的。

考虑,使用AcitveX方法得到AutoCAD.Application试试看,如果成功,说明有AutoCAD正在运行,反之没有。可是innosetup的pascal不支持activex, 所以,只好写个EXE来判断。这里用delphi写:

  1. [FONT=courier new][COLOR=darkblue]
  2. program TestAcad;

  3. uses
  4.   Forms,
  5.   ComObj;

  6. {$R *.RES}

  7. var AcadApp: OleVariant;

  8. begin
  9.   Application.Initialize;
  10.   try
  11.     acadapp:=GetActiveOleobject('AutoCAD.Application');
  12.   except
  13.    on EOleSysError do
  14.         Halt(1);
  15.   end;
  16.   Application.Terminate;
  17. end.
  18. [/COLOR][/FONT]
复制代码


编译生成的TestACAD.EXE见附件。(待续)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-26 10:16:22 | 显示全部楼层
上面的做成EXE的办法当然不是最好的。好一点,显得专业一点的方法是写成一个DLL,在inno setup中调用。我的水平有限,没有用Delphi写过Dll,所以写成了EXE程序。

要知道,EXE程序也是有返回值的,前面那个Halt(1)表示当找不到Acad.application时,返回1(找到了的话,默认值返回0)

因此,setup.iss安装脚本中的函数

  1. [FONT=courier new]
  2. function AutoCADRunning: boolean;
  3. var exitcode: integer;
  4. begin
  5.   ExtractTemporaryFile('TestAcad.exe');
  6.   InstExec(ExpandConstant('{tmp}')+'\TestAcad.exe', '', '', true, true, SW_HIDE, ExitCode);
  7.   result := (exitcode = 0);
  8. end;
  9. [/FONT]
复制代码

就可以判断AutoCAD是否正在运行了。

在initializesetup中加上这段蓝色,应该可以防止安装程序在AutoCAD运行的时候安装。

  1. [FONT=courier new]
  2. function InitializeSetup(): Boolean;
  3. var mresult: integer;
  4. begin
  5.   result := true;
  6.   if not AutoCADInstalled then
  7.   begin
  8.     MsgBox('您的系统中没有安装AutoCAD。本程序是运行在AutoCAD平台上的,所以不能安装。', mbError, MB_OK);
  9.     result := false;
  10.   end;
  11. [color=Navy]
  12.   MResult:= IDRETRY;
  13.   while (MResult=IDRETRY) AND AutoCADRunning do
  14.   begin
  15.     mresult := MsgBox('检测到AutoCAD正在运行。'#13#13'请先退出AutoCAD后按[重试(Retry)]'#13'按[取消(Cancel)]退出安装', mbError, MB_RETRYCANCEL);
  16.     if MResult = IDCANCEL then result := false;
  17.   end;
  18. [/color]
  19. end;[/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-26 10:30:20 | 显示全部楼层
下面就是往注册表中写内容了,即往各个版本的AutoCAD中加一条XDSoft菜单,这个过程有点麻烦,而且需要保证卸载的时候不会损害原来的系统。

先看一下相关的键值:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-26 10:59:07 | 显示全部楼层
各个版本的AutoCAD(14,15,16)的注册表键的位置是差不多的。
所以,安装的时候,循环,查找各个版本的AutoCAD,某个版本的AutoCAD下面的各个Profiles的menu。
如果存在Group1, group2, 加一条group3, 指向自己的菜单文件。在搜索路径中加上自己的搜索路径,这是一个简单的字符串操作。
保持一个安全稳定的卸载程序也是必要的(讲点道德嘛,呵呵)。卸载的时候,从搜索路径中移除自己添加的搜索路径(这个麻烦一点,需要查找之类的操作),移除自己增加的menu group, 这里也有一个问题:如果存在Group1, group2, group3, group4,
而查找后发现自己加的是group3, 那么还不能直接删除。直接删除的结果将导致group4也会在下次启动AutoCAD的时候消失。因此,删除自己的group3后,要把后面的group依次前移,group4改名成group3, group5改名成group4. 等等。这些注册表操作相对比较麻烦一点。
这些注册表操作功能我写在了一个单独的EXE文件中,有两个理由:
1. 这些操作比较复杂,使用inno setup的脚本写有点力不从心。
2. 卸载的时候,有些操作必须程序判断(比如改group4为group3)。innosetup不支持卸载时的脚本程序,但有一个UninstallRun段,指定卸载时先运行的EXE程序。

上述方法是针对加一条菜单的做法的。

如果是象天正,理正这样的大型二次开发软件,一般是建一个全新的profile, 就不需要这么麻烦。自己创建全部的菜单即可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-26 11:08:53 | 显示全部楼层
这个SetReg.EXE文件的源代码与可执行文件都在附件中:
不带参数运行这个EXE程序可以得到帮助提示。
(虽然我捉了好久的虫,这个程序可能还存在Bug,有心的朋友如果愿意完善它,当然是非常欢迎的)
不管怎样,由于这个程序是操作注册表而且免费,我有必要声明一段,嘿嘿:

本程序免费可供进行任何用途需求的拷贝、修改及发行, 但请遵循下述原则:
本程序仅提供作为应用上的参考, 而未声明或隐含任何保证; 对于任何特殊
用途之适应性, 以及商业销售所隐含作出的保证, 在此一概予以否认.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-26 11:22:59 | 显示全部楼层
Links:

inno setup: http://www.jrsoftware.org/isinfo.php
inno setup extension: http://isx.wintax.nl/
Inno Setup Preprocessor: http://yackimoff.cjb.net/
istool: http://www.istool.org/

newsgroup: http://www.jrsoftware.org/newsgroups.php

(完)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-20 08:06 , Processed in 0.182714 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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