明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4302|回复: 12

[资源] (原创)浅析使用Inno打包AutoCAD二次开发程序(NET)

[复制链接]
发表于 2011-5-8 23:23 | 显示全部楼层 |阅读模式
目前打包的程序比较多,打包的方法也多,本人把使用Inno打包CAD二次开发程序的过程和大家分享下。(之前也截了点图:http://blog.sina.com.cn/s/blog_69e8fdf00100oqmr.html,不过那里面最后的脚本是修改之前的,本篇的脚本见文末)大家讨论讨论。
举个简单的例子:安装过程中选择CAD版本安装,安装后安装文件中释放的某DLLCAD启动加载。
由于AutoCAD版本比较多,一般部署安装思路比较明确,如下
1.搜索出本机安装的CAD版本,并显示在一个安装界面中,供用户安装时选择。
2.根据用户的选择,安装的时候把程序安装到相应的CAD版本下。
具体操作:
使用Inno的向导,一步步下来就生成一个简单的脚本。但是默认是不能生成我们希望的那个选择CAD版本的界面,如下图:

这就涉及到几个问题:
1.
Inno脚本中添加自定义界面;
2.
安装的时候搜索出本机安装的CAD版本并调整自定义界面中的复选框的状态
3.
用户选择相应的版本继续下一步,没选则停留在本界面。
针对上面的问题处理如下:
1.
使用Pascal脚本创建自定义界面,代码如下:
var

CheckBox1,CheckBox2: TCheckBox;

var

ACAD2010: Boolean;
//CAD2010是否存在的标记

ACAD2011: Boolean;

var

myPage:TwizardPage;
//自定义的窗口

myPageID:Integer;
procedureCreateAddonPage;
//创建自定义窗体
begin

myPage := CreateCustomPage(wpInfoBefore, '选择需要安装的CAD版本', '请根据您的需要选择安装的CAD版本,本程序仅支持AutoCAD2010及以上版本!');

myPageID:=myPage.ID;

CheckBox1 := TCheckBox.Create(myPage);

CheckBox1.Left := ScaleX(80);

CheckBox1.Top := ScaleY(40);

CheckBox1.Width := myPage.SurfaceWidth;

CheckBox1.Height := ScaleY(17);

CheckBox1.Caption := 'AutoCAD2010';

CheckBox1.Parent := myPage.Surface;

CheckBox1.Enabled:= ACAD2010 ;

if
(CheckBox1.Enabled) then

begin

CheckBox1.Checked := true;

end else

begin

CheckBox1.Checked := false;

end;

CheckBox2 :=TCheckBox.Create(myPage);

CheckBox2.Left := ScaleX(80);

CheckBox2.Top := CheckBox1.Top + ScaleY(60);

CheckBox2.Width := myPage.SurfaceWidth;

CheckBox2.Height := ScaleY(17);

CheckBox2.Caption := 'AutoCAD2011';

CheckBox2.Parent := myPage.Surface;

CheckBox2.Enabled:= ACAD2011 ;

if
(CheckBox2.Enabled) then

begin

CheckBox2.Checked := true;

end else

begin

CheckBox2.Checked := false;

end;
end;
网上搜索了下说是Pascal脚本,对这个语言也不熟,使用Inno的时候刚接触。大家编程的应该都能看懂个大概:先定义全局的变量,然后创建窗体并设置复选框信息。对照着上面的图看。
代码要在procedure InitializeWizard(); 事件中调用,这个事件表示在开始的时候改变向导或者向导页。
2.
接下来就涉及到第2个问题,搜索本机CAD版本
当然是安装的时候读取注册表得到安装的CAD信息,把这个过程放在functionInitializeSetup(): Boolean;中,它安装初始时调用。代码如下:
functionInitializeSetup(): Boolean;
begin

if RegvalueExists(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804','AcadLocation') then

begin

ACAD2011 := true;

end else

begin

ACAD2011 := false;

end;

if RegvalueExists(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804','AcadLocation') then

begin

ACAD2010 := true;

end else

begin

ACAD2010 := false;

end;

if RegvalueExists(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8005:804','AcadLocation') then

begin

ACAD2010 := true;

end

Result := True
end;
注:关于上面CAD2010的版本判断了两个,一个是ACAD-8001:804,还有一个是ACAD-8005:804,我见过这两个都表示CAD2010,不是很明白怎么回事。
3.
根据用户的操作决定安装是否继续
判断用户是否选择了CAD版本,那就是判断复选框是否有选中的,代码放在function NextButtonClick(CurPageID:Integer): Boolean;中, /当用户单击下一步按钮时调用。如返回True,将移到下一页;如返回False,保留在当前页。代码如下:
function NextButtonClick(CurPageID:Integer):Boolean; //当用户单击下一步按钮时调用。如返回True,将移到下一页;如返回False,保留在当前页。
begin

if CurPageID=myPageID then

begin

if(CheckBox1.Checked=false)and
(CheckBox2.Checked=false)
then
//如果都没有选中就停留在本界面

begin

MsgBox('请先选择CAD安装版本!', mbConfirmation, MB_OK)

end

else

result:=true;

end

else

result:=true;
end;
好了,到此前期工作都做的差不多了,就遇到了新的问题:
1.
如何根据用户的选择把信息写入的注册表
2.
卸载时如何删除写入的注册表。
处理如下:

Inno有个[Registry]下面可以写注册表,但是不放在这个下面,因为他只写了固定的位置,而我们不同的电脑上装的CAD版本不同,注册表中的位置不同。
1.把写入注册表的代码上在procedureCurStepChanged(CurStep: TSetupStep);中,它表示安装中的状态。
procedureCurStepChanged(CurStep: TSetupStep);
//安装中的状态
begin

if CurStep=ssPostInstall then //实际安装完成后

if
(CheckBox1.Checked) then

begin

RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804\Applications\MoKaCADTools','LOADER',
ExpandConstant('{app}')+'\KakaNimo.dll');

RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804\Applications\MoKaCADTools','DESCRIPTION', '使MoKaCADTools随CAD启动!');

RegWriteDWordValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804\Applications\MoKaCADTools','LOADCTRLS', 2);

RegWriteDWordValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804\Applications\MoKaCADTools','MANAGED', 1);

end;

if
(CheckBox2.Checked) then

begin

RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804\Applications\MoKaCADTools','LOADER',
ExpandConstant('{app}')+'\KakaNimo.dll');

RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804\Applications\MoKaCADTools','DESCRIPTION', '使MoKaCADTools随CAD启动!');

RegWriteDWordValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804\Applications\MoKaCADTools','LOADCTRLS', 2);

RegWriteDWordValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804\Applications\MoKaCADTools','MANAGED', 1);

end;
end;
2.同样,卸载的代码就放在卸载事件中:
functionInitializeUninstall(): Boolean;
//卸载事件
begin

if RegvalueExists(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804','AcadLocation') then

RegDeleteKeyIncludingSubkeys(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:804\Applications\MoKaCADTools');

if RegvalueExists(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804','AcadLocation') then

RegDeleteKeyIncludingSubkeys(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:804\Applications\MoKaCADTools');

if RegvalueExists(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8005:804','AcadLocation') then

RegDeleteKeyIncludingSubkeys(HKLM,'SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8005:804\Applications\MoKaCADTools');

Result := True
end;
安装的重点就上面这些,其他一些附属的东西就简单多了,如改变安装时显示的信息等等,举个例子,如下图:

[Messages]下,代码:
[Messages]
ClickNext=单击“下一步”继续,或单击“取消”退出安装程序。%n%n%n%n%n%n%n%n本程序由KAKA制作%n%n欢迎朋友们访问KAKA的Blog:%n%nhttp://blog.sina.com.cn/nimokaka%n%n http://hi.baidu.com/kakanimo
具体脚本我上传了,见:http://www.rayfile.com/zh-cn/files/ea691794-7984-11e0-b714-0015c55db73d/

本帖子中包含更多资源

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

x
发表于 2021-9-6 22:20 | 显示全部楼层
脚本下不了,能否发给我一下,谢谢 我邮箱76533206@qq.com
发表于 2021-9-20 22:42 | 显示全部楼层
正好需要,有空的时候研究下,谢谢了!
发表于 2022-4-18 07:21 | 显示全部楼层
这个脚本在哪能下载啊
发表于 2011-5-9 08:41 | 显示全部楼层
卡卡尼莫换马甲了?
 楼主| 发表于 2011-5-9 10:18 | 显示全部楼层
回复 cdinten 的帖子

没有啊,一直是这个啊。
发表于 2011-5-9 15:17 | 显示全部楼层
写得很详细
发表于 2011-7-10 05:38 | 显示全部楼层
回复 gulong2001 的帖子

很好呀.....................
发表于 2011-7-15 22:07 | 显示全部楼层
看贴回贴是美德~谢谢
发表于 2011-7-25 14:09 | 显示全部楼层
回复 gulong2001 的帖子

感谢尼莫 又让我学习了
发表于 2011-8-12 10:02 | 显示全部楼层
我的DLL工具安装是我自已编写了一个简单的安装程序,主要是供使用者选择CAD版本、注册相应模块,工具命令写入CAD启动文件。至于NET我就不知道咋搞了。有时间一定试试这个。
发表于 2011-8-16 01:46 | 显示全部楼层
感谢分享,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 11:07 , Processed in 0.561542 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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