gulong2001 发表于 2011-5-8 23:23:30

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

目前打包的程序比较多,打包的方法也多,本人把使用Inno打包CAD二次开发程序的过程和大家分享下。(之前也截了点图:http://blog.sina.com.cn/s/blog_69e8fdf00100oqmr.html,不过那里面最后的脚本是修改之前的,本篇的脚本见文末)大家讨论讨论。举个简单的例子:安装过程中选择CAD版本安装,安装后安装文件中释放的某DLL随CAD启动加载。由于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 := Trueend;注:关于上面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有个下面可以写注册表,但是不放在这个下面,因为他只写了固定的位置,而我们不同的电脑上装的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 := Trueend; 安装的重点就上面这些,其他一些附属的东西就简单多了,如改变安装时显示的信息等等,举个例子,如下图:
在下,代码: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/

wskxvknui 发表于 2021-9-6 22:20:32

脚本下不了,能否发给我一下,谢谢 我邮箱76533206@qq.com

SWAYWOOD 发表于 2021-9-20 22:42:48

正好需要,有空的时候研究下,谢谢了!

烟盒迷唇 发表于 2022-4-18 07:21:35

这个脚本在哪能下载啊

cdinten 发表于 2011-5-9 08:41:35

卡卡尼莫换马甲了?

gulong2001 发表于 2011-5-9 10:18:30

回复 cdinten 的帖子

没有啊,一直是这个啊。

pyt5208 发表于 2011-5-9 15:17:06

写得很详细

ramand 发表于 2011-7-10 05:38:46

回复 gulong2001 的帖子

很好呀.....................

有多种无奈 发表于 2011-7-15 22:07:31

看贴回贴是美德~谢谢

cumtjh 发表于 2011-7-25 14:09:05

回复 gulong2001 的帖子

感谢尼莫 又让我学习了

aceowen 发表于 2011-8-12 10:02:10

我的DLL工具安装是我自已编写了一个简单的安装程序,主要是供使用者选择CAD版本、注册相应模块,工具命令写入CAD启动文件。至于NET我就不知道咋搞了。有时间一定试试这个。

114509 发表于 2011-8-16 01:46:21

感谢分享,学习了。
页: [1] 2
查看完整版本: (原创)浅析使用Inno打包AutoCAD二次开发程序(NET)