AutoCAD二次开发安装程序制作(2019-11-11)
本帖最后由 秋枫 于 2019-11-14 15:43 编辑 <br /><br />更新一波:
2019年09月19日 发现一个bug,修正:在有多少pc3路径时,取第一个。
新功能供测试:
更新历史
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命令加载它。
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日
增加两个选项
SkipReadyPage=yes
AllowAutoCADRunning=yes
2008年9月3日
在增加ExtraInfoString=
;;;样例: ExtraInfoString=运行卸载程序将会删除你的数据文件xxx和xxx,请视需要自行备份……
2008年9月2日
在中增加一个SkipSelectDir项
SkipSelectDir=yes将跳过选择目录的对话框。
2007年2月28日
在INI中对PlotStyles段作了一些调整,添加了一些类似的段
PlotStyles段指定需要安装的打印样式表
FileName1={src}\DATA\*.stb
FileName2={src}\DATA\*.ctb
FileName从FileName1开始,数量不限,但实际复制条目总数不超过50条(视机器中AutoCAD安装的版本数与配置数而定,所以请尽量用通配符)。
其它指定需要特别安装的文件
FileName1=
FileName1=
FileName1=
FileName1=
限制与PlotStyles段相同,写法也相同
PC3指打印机配置文件;PMP指图纸幅面文件;Template指DWG模板DWT文件;SheetSetTemplate指图纸集模板文件
2007年2月27日
在ini中添加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 本帖最后由 作者 于 2009-11-25 15:39:26 编辑 <br /><br /> <p>更新历史见下载页面:</p><p><br/>点击进入下载页面:</p><p><a href="http://fresco.yo2.cn/archives/647585">http://fresco.yo2.cn/archives/647585</a><a href="http://fresco.yo2.cn/archives/647582"></a><a href="http://fresco.yo2.cn/archives/636512"></a><a href="http://fresco.yo2.cn/go/92110.html"></a><br/></p> 引用秋枫大哥AutoCAD二次开发安装程序制作(2019-11-11)http://bbs.mjtd.com/thread-35156-1-1.html,生成的安装包无法读取注册表信息,电脑系统64位Win7,CAD2007(32位),vl-registry-read返回nil,相关代码如下:
(defun GetMyApplicationPath ()
(vl-registry-read
(strcat
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
"MemMas_is1"
)
"Inno Setup: App Path"
)
)
但我在注册表里是可以找到相关信息的,如下图
http://bbs.mjtd.com/forum.php?mod=attachment&aid=MTEyNDQ2fDAwZTZiMjEwfDE2MTU2NDgyMDl8MjgxOTgzfDE4MzExNA%3D%3D&noupdate=yes
如果使用秋枫大哥老版的制作程序生成的安装包,采用相同的代码是可以读取注册表信息的。
秋枫大哥,强烈建议增加支持浩辰CAD 秋枫大侠,一直很仰慕您。您的批量打印程序,我十分喜欢,以前有个版本的也有源码,但是有很多BUG.
你说因为论坛上一些人的原因,不愿意公布源码,能不能考虑时下有选择的公布源码呢,如果可以的话,
我的邮箱:cjp20038175@hotmail.com,谢谢,摆脱了。。。。
秋枫兄,你能提供脚本吗?或者提供如何把选中的文件作为启动文件吗? spshchen发表于2005-4-21 9:49:00static/image/common/back.gif秋枫兄,你能提供脚本吗?或者提供如何把选中的文件作为启动文件吗?
就是遍历注册表:procedure AddAutoLoadLisp;
var i, j, k, n: integer;
StartupToAdd, key, tmp: string;
profiles: TArrayOfString;
StringList: TStringList;
ApploadLoadCtrls: Cardinal;
begin
StartupToAdd := ExpandConstant('{app}\{ini:{src}\setup.ini,General,LISPStartup|}'); // 设置appload的loadctrls
for i := 0 to GetArrayLength(SupportedAcadKeys) -1 do
begin
if RegQueryDWordValue(HKLM, SupportedAcadKeys+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls) then
begin
ApploadLoadCtrls := (ApploadLoadCtrls or 2);
RegWriteDWordValue(HKLM, SupportedAcadKeys+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls);
end;
if RegQueryDWordValue(HKCU, SupportedAcadKeys+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls) then
begin
ApploadLoadCtrls := (ApploadLoadCtrls or 2);
RegWriteDWordValue(HKCU, SupportedAcadKeys+'\Applications\AcadAppload', 'LOADCTRLS', ApploadLoadCtrls);
end;
end; StringList := TStringList.Create;
try
for i := 0 to GetArrayLength(SupportedAcadKeys) -1 do
if AutoCADSelectPage.Values // 用户选中要求安装的
and RegGetSubkeyNames(HKCU, SupportedAcadKeys+'\profiles', profiles) // 并且存在Profiles, 取得所有Profiles
then
for j := 0 to GetArrayLength(profiles)-1 do
if regkeyExists(HKCU, SupportedAcadKeys+'\Profiles\'+profiles+'\Dialogs') then
begin
key := SupportedAcadKeys+'\Profiles\'+profiles+'\Dialogs\Appload\Startup';
if not regkeyExists(HKCU, key) then RegWriteStringValue(HKCU, key, 'NumStartup', '0');
RegQueryStringValue(HKCU, key, 'NumStartup', tmp);
// 读入已有Startup列表
n := StrToIntDef(tmp, 0);
StringList.Clear;
for k := 1 to n do
begin
RegQueryStringValue(HKCU, key, IntToStr(k)+'Startup', tmp);
StringList.Add(tmp);
RegDeleteValue(HKCU, key, IntToStr(k)+'Startup');
end;
// 去除重复文件与不存在的文件
for k := StringList.Count - 1 downto 0 do
if (UpperCase(StringList)=UpperCase(startupToAdd)) or (not FileExists(StringList))
then StringList.Delete(k);
// 添加要加的文件
StringList.Add(startupToAdd);
// 重建键值
for k := 0 to StringList.Count - 1 do
RegWriteStringValue(HKCU, key, IntToStr(k+1)+'Startup', StringList);
// 设置总数
RegWriteStringValue(HKCU, key, 'NumStartup', IntToStr(StringList.Count));
end;
finally
StringList.Free;
end;
end;
怎么把指定的菜单文件加入注册表呢?请给个pascal例子 请自行查看顶楼相关链接。菜单文件加入注册表请自行编程。AutoCAD版本不同需要考虑处理的情况也不同。本人没有做这方面的工作。 秋枫兄,有没有可用于VBA的打包分发程序啊,或者告诉我怎么通过查询注册表得到子键的名称,也就是如何在VB6.0中通过API获得AutoCAD的版本,或者把“就是遍历注册表:”那一段源程序改写成VB代码。
我现在的难题是找不到一个可以查询子键名称的API函数,既然你可以判断CAD版本,就肯定是遍历了Autodesk\AutoCAD下的子键,在VB中可用吗?
还有,你的上述代码是用什么语言写的? 他是在 INNO SETUP 里用PASCAL写的 ,在运行安装程序的时候运行的,所以不需要用VB什么写,他是主要功能 就是让你的一个程序能在CAD启动的时候 启动,而你自己要加载的 东西都放在这个启动程序里就可以了. dyheng发表于2005-4-23 18:55:00static/image/common/back.gif秋枫兄,有没有可用于VBA的打包分发程序啊,或者告诉我怎么通过查询注册表得到子键的名称,也就是如何在VB6.0中通过API获得AutoCAD的版本,或者把“就是遍历注册...
<BR>
Windows API函数为:RegEnumKeyExA
帮你Google了一下,你可以参考这个链接:
<A href="http://www.sxnw.gov.cn/personal/vbworld/articles/api/htmapi23.htm" target="_blank" >http://www.sxnw.gov.cn/personal/vbworld/articles/api/htmapi23.htm</A> 我用了那个6月份的版本,遇到了2个问题。
1.在软件卸载后如果没有重起电脑,就打开cad,系统会提示找不到菜单文件。
2.我的菜单在2000中正常加载并显示,而在2004里只是加载了并不显示出来。
附上我的自动运行lsp,主要来自哪篇教程,我自是改了几个地方。