明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 201370|回复: 437

[资源] AutoCAD二次开发安装程序制作(2011-04-20)

    [复制链接]
发表于 2005-4-11 21:57 | 显示全部楼层 |阅读模式
本帖最后由 秋枫 于 2015-12-11 15:33 编辑

新功能供测试: 更新历史 2014年12月1日 总是有意外。在AutoCAD 2014+,需要添加信任区域才能自动加载。 改进安装程序。 Setup.ini中添加一个TrustedPaths={app}选项 2011年4月20日 因为AutoCAD的版本越来越多,为方便向后支持,允许在通配符中写成: VersionSupport=R15.0;>R15.0 这种形式 2010年8月7日 支持64bit下的64Bit的AutoCAD。 2010年2月24日 修正了卸载时List Out of Index的错误。 在AutoCAD运行时加载时改用vl-load-all 2009年11月24日 修正了卸载程序中注册表中读到的路径没有展开系统环境变量的问题。 这个错误比较严重,但仅限于AutoCAD 2010以上系统。如需支持新版本AutoCAD的安装程序请及时更新。 这个程序也涉及了本人的批量打印程序的卸载程序。 紧急修复:通用二次开发安装程序对AutoCAD 2010的bug 因为AutoCAD2010以往的版本在注册表中写入的是绝对路径,并不含环境变量,在2010中,环境变量也包含在路径中,因此需要安装程序和卸载程序对环境变量扩展。在今年6月份时注意到了这个问题,修正了一部分,但卸载程序中的部分代码没有修正。后果是造成在卸载程序时删除了部分含环境变量的搜索路径。 一般表现为:卸载后(或安装前提示是否卸载旧版,选“是”之后)会删除cad在系统盘的一个搜索路径:%AppData%\Autodesk\AutoCAD 2010\R18.0\chs\support,导致很多功能失效。 现提供修复程序(针对AutoCAD 2010,其它版本无此问题,稍后提供更新后的安装程序,建议用更新后的安装程序覆盖安装一次以修正原卸载程序,覆盖安装前如提示发现旧版时不要卸载旧版) 使用方法: 将解开后的LSP文件拖入AutoCAD窗口或使用Appload命令加载它。 下载链接: http://fresco.yo2.cn/archives/647582 2009年6月10日 修正了注册表中读到的路径没有展开系统环境变量的问题。 2008年12月22日 DefaultPath 改为支持绝对路径 例如:DefaultPath={pf}\mylispapp 或 DefaultPath=D:\MylispApp 如果未写成绝对路径,则默认为相对于{pf}即%ProgramFiles%,所以DefaultPath={pf}\MylispApp与DefaultPath=MylispApp等效 2008年9月5日 LISPStartup=改为支持绝对路径 原来的可以写成:LISPStartup={app}\loadxx.lsp 原来相对路径的写法也可以继续使用 2008年9月4日 增加两个选项[General] SkipReadyPage=yes AllowAutoCADRunning=yes 2008年9月3日 在[Uninstall]增加ExtraInfoString= ;;;样例: ExtraInfoString=运行卸载程序将会删除你的数据文件xxx和xxx,请视需要自行备份…… 2008年9月2日 在[General]中增加一个SkipSelectDir项 SkipSelectDir=yes将跳过选择目录的对话框。 2007年2月28日 在INI中对PlotStyles段作了一些调整,添加了一些类似的段 PlotStyles段指定需要安装的打印样式表 [PlotStyles] FileName1={src}\DATA\*.stb FileName2={src}\DATA\*.ctb  FileName从FileName1开始,数量不限,但实际复制条目总数不超过50条(视机器中AutoCAD安装的版本数与配置数而定,所以请尽量用通配符)。 其它指定需要特别安装的文件 [PC3] FileName1= [PMP] FileName1= [Template] FileName1= [SheetSetTemplate] FileName1=  限制与PlotStyles段相同,写法也相同 PC3指打印机配置文件;PMP指图纸幅面文件;Template指DWG模板DWT文件;SheetSetTemplate指图纸集模板文件 2007年2月27日 在ini中添加PlotStyles段: PlotStyles段指定需要安装的打印样式表 [PlotStyles] FileName1={src}\DATA\*.stb FileName2={src}\DATA\*.ctb  FileName允许从FileName1到FileName100。 2006年8月31日 1. 在ini中添加FileCopy_NeverOverWrite_#段 执行普通的文件复制操作外,当发现用户目标系统中已经存在此文件时,不复制,保留用户原文件。可用于保留用户的配置文件。 2. 更新7z压缩程序 2006年8月30日 1. 修正AutoCAD版本列表条目的显示 2006年5月25日 1. 应“风云”的强烈要求,ini加上一条ReadMeDescription=用于自定显示字串 2006年5月22日: 1. 添加安装完最后显示“自述文件”的勾选选项 2. 在文件复制段添加DestName设置允许改名复制 3. 添加BevelLabel标签 2006年5月19日: 1. 添加用户自定义文件复制路径的支持。 2. 支持文件向系统注册为OLE服务 3. 添加InstallDelete与UninstallDelete段,控制在安装前与卸载后删除文件 4. 自定义图标改为绝对路径 2006年5月18日: 1. 允许自定义注册表项 2. 允许自定义开始菜单中的快捷方式 3. 允许在安装前、后、卸载前自定义运行外部程序 4. 在向导页面中加入了高级自定义按钮及帮助文档(如附图) 2005年5月20日: 1. 允许不创建开始菜单组 2. 加入卸载时卸载指定的菜单组支持 3. 加入对安装包的维护功能 --第一版-- [原创]AutoLISP程序的安装制作教程(一) http://bbs.mjtd.com/thread-35031-1-1.html [原创]AutoLISP程序的安装制作教程(二) http://bbs.mjtd.com/thread-35151-1-1.html 旧版:支持14~2005 的讨论与下载: http://bbs.mjtd.com/thread-17712-1-1.html

本帖子中包含更多资源

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

x

评分

参与人数 4威望 +2 明经币 +2 金钱 +60 贡献 +5 激情 +5 收起 理由
BaoWSE + 1 赞一个!这么有才华的人
pslstar + 1
zctao1966 + 50 很给力!
mccad + 2 + 10 + 5 + 5 【精华】好程序

查看全部评分

本帖被以下淘专辑推荐:

  • · 特技|主题: 3, 订阅: 0
发表于 2012-4-21 21:14 | 显示全部楼层
秋枫大侠,一直很仰慕您。您的批量打印程序,我十分喜欢,以前有个版本的也有源码,但是有很多BUG.
你说因为论坛上一些人的原因,不愿意公布源码,能不能考虑时下有选择的公布源码呢,如果可以的话,
我的邮箱:cjp20038175@hotmail.com,谢谢,摆脱了。。。。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2005-4-12 22:51 | 显示全部楼层
本帖最后由 作者 于 2009-11-25 15:39:26 编辑

更新历史见下载页面:


点击进入下载页面:

http://fresco.yo2.cn/archives/647585

发表于 2005-4-21 09:49 | 显示全部楼层
秋枫兄,你能提供脚本吗?或者提供如何把选中的文件作为启动文件吗?
 楼主| 发表于 2005-4-21 20:39 | 显示全部楼层
spshchen发表于2005-4-21 9:49:00秋枫兄,你能提供脚本吗?或者提供如何把选中的文件作为启动文件吗?
就是遍历注册表:
  1. procedure AddAutoLoadLisp;
  2. var i, j, k, n: integer;
  3.    StartupToAdd, key, tmp: string;
  4.    profiles: TArrayOfString;
  5.    StringList: TStringList;
  6.    ApploadLoadCtrls: Cardinal;
  7. begin
  8.    StartupToAdd := ExpandConstant('{app}\{ini:{src}\setup.ini,General,LISPStartup|}');   // 设置appload的loadctrls
  9.    for i := 0 to GetArrayLength(SupportedAcadKeys) -1 do
  10.    begin
  11.        if RegQueryDWordValue(HKLM, SupportedAcadKeys[i]+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls) then
  12.        begin
  13.            ApploadLoadCtrls := (ApploadLoadCtrls or 2);
  14.            RegWriteDWordValue(HKLM, SupportedAcadKeys[i]+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls);
  15.        end;
  16.        if RegQueryDWordValue(HKCU, SupportedAcadKeys[i]+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls) then
  17.        begin
  18.            ApploadLoadCtrls := (ApploadLoadCtrls or 2);
  19.            RegWriteDWordValue(HKCU, SupportedAcadKeys[i]+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls);
  20.        end;
  21.    end;   StringList := TStringList.Create;
  22.    try
  23.    for i := 0 to GetArrayLength(SupportedAcadKeys) -1 do
  24.        if AutoCADSelectPage.Values[i]     // 用户选中要求安装的
  25.              and RegGetSubkeyNames(HKCU, SupportedAcadKeys[i]+'\profiles', profiles) // 并且存在Profiles, 取得所有Profiles
  26.        then
  27.            for j := 0 to GetArrayLength(profiles)-1 do
  28.                if regkeyExists(HKCU, SupportedAcadKeys[i]+'\Profiles\'+profiles[j]+'\Dialogs') then
  29.                begin
  30.                    key := SupportedAcadKeys[i]+'\Profiles\'+profiles[j]+'\Dialogs\Appload\Startup';
  31.                    if not regkeyExists(HKCU, key) then RegWriteStringValue(HKCU, key, 'NumStartup', '0');
  32.                    RegQueryStringValue(HKCU, key, 'NumStartup', tmp);
  33.                    // 读入已有Startup列表
  34.                    n := StrToIntDef(tmp, 0);
  35.                    StringList.Clear;
  36.                    for k := 1 to n do
  37.                    begin
  38.                      RegQueryStringValue(HKCU, key, IntToStr(k)+'Startup', tmp);
  39.                      StringList.Add(tmp);
  40.                      RegDeleteValue(HKCU, key, IntToStr(k)+'Startup');
  41.                    end;
  42.                    // 去除重复文件与不存在的文件
  43.                    for k := StringList.Count - 1 downto 0 do
  44.                    if (UpperCase(StringList[k])=UpperCase(startupToAdd)) or (not FileExists(StringList[k]))
  45.                        then StringList.Delete(k);
  46.                    // 添加要加的文件
  47.                    StringList.Add(startupToAdd);
  48.                    // 重建键值
  49.                    for k := 0 to StringList.Count - 1 do
  50.                          RegWriteStringValue(HKCU, key, IntToStr(k+1)+'Startup', StringList[k]);
  51.                    // 设置总数
  52.                    RegWriteStringValue(HKCU, key, 'NumStartup', IntToStr(StringList.Count));
  53.                end;
  54.    finally
  55.        StringList.Free;
  56.    end;
  57. end;
发表于 2005-4-22 21:57 | 显示全部楼层
怎么把指定的菜单文件加入注册表呢?请给个pascal例子
 楼主| 发表于 2005-4-23 09:39 | 显示全部楼层
请自行查看顶楼相关链接。菜单文件加入注册表请自行编程。AutoCAD版本不同需要考虑处理的情况也不同。本人没有做这方面的工作。
发表于 2005-4-23 18:55 | 显示全部楼层
秋枫兄,有没有可用于VBA的打包分发程序啊,或者告诉我怎么通过查询注册表得到子键的名称,也就是如何在VB6.0中通过API获得AutoCAD的版本,或者把“就是遍历注册表:”那一段源程序改写成VB代码。


我现在的难题是找不到一个可以查询子键名称的API函数,既然你可以判断CAD版本,就肯定是遍历了Autodesk\AutoCAD下的子键,在VB中可用吗?


还有,你的上述代码是用什么语言写的?
发表于 2005-4-23 22:31 | 显示全部楼层
他是在 INNO SETUP         里用PASCAL写的 ,在运行安装程序的时候运行的,所以不需要用VB什么写,他是主要功能 就是让你的一个程序能在CAD启动的时候 启动,而你自己要加载的 东西都放在这个启动程序里就可以了.
 楼主| 发表于 2005-4-24 00:01 | 显示全部楼层
dyheng发表于2005-4-23 18:55:00秋枫兄,有没有可用于VBA的打包分发程序啊,或者告诉我怎么通过查询注册表得到子键的名称,也就是如何在VB6.0中通过API获得AutoCAD的版本,或者把“就是遍历注册...

Windows API函数为:RegEnumKeyExA 帮你Google了一下,你可以参考这个链接: http://www.sxnw.gov.cn/personal/vbworld/articles/api/htmapi23.htm
发表于 2005-4-26 19:14 | 显示全部楼层
我用了那个6月份的版本,遇到了2个问题。


1.在软件卸载后如果没有重起电脑,就打开cad,系统会提示找不到菜单文件。


2.我的菜单在2000中正常加载并显示,而在2004里只是加载了并不显示出来。


附上我的自动运行lsp,主要来自哪篇教程,我自是改了几个地方。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2018-6-22 05:23 , Processed in 0.290403 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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