目前打包的程序比较多,打包的方法也多,本人把使用Inno打包CAD二次开发程序的过程和大家分享下。(之前也截了点图:http://blog.sina.com.cn/s/blog_69e8fdf00100oqmr.html,不过那里面最后的脚本是修改之前的,本篇的脚本见文末)大家讨论讨论。
举个简单的例子:安装过程中选择CAD版本安装,安装后安装文件中释放的某DLL随CAD启动加载。
由于AutoCAD版本比较多,一般部署安装思路比较明确,如下
1.搜索出本机安装的CAD版本,并显示在一个安装界面中,供用户安装时选择。
2.根据用户的选择,安装的时候把程序安装到相应的CAD版本下。
具体操作:
使用Inno的向导,一步步下来就生成一个简单的脚本。但是默认是不能生成我们希望的那个选择CAD版本的界面,如下图:
http://s13/middle/69e8fdf0n9a3fac38eecc&690&690
这就涉及到几个问题:
1.
在Inno脚本中添加自定义界面;
2.
安装的时候搜索出本机安装的CAD版本并调整自定义界面中的复选框的状态
3.
用户选择相应的版本继续下一步,没选则停留在本界面。
针对上面的问题处理如下:
1.
使用Pascal脚本创建自定义界面,代码如下:
var
CheckBox1,CheckBox2:
TCheckBox;
var
ACAD2010: Boolean;
//CAD2010是否存在的标记
ACAD2011: Boolean;
var
myPage:TwizardPage;
//自定义的窗口
myPageID:Integer;
procedure CreateAddonPage;
//创建自定义窗体
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信息,把这个过程放在function InitializeSetup():
Boolean;中,它安装初始时调用。代码如下:
function InitializeSetup(): 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.把写入注册表的代码上在procedure
CurStepChanged(CurStep: TSetupStep);中,它表示安装中的状态。
procedure CurStepChanged(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.同样,卸载的代码就放在卸载事件中:
function InitializeUninstall(): 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;
安装的重点就上面这些,其他一些附属的东西就简单多了,如改变安装时显示的信息等等,举个例子,如下图:
http://s4/middle/69e8fdf0n9a3fabd9caf3&690&690
在[Messages]下,代码:
[Messages]
ClickNext=单击“下一步”继续,或单击“取消”退出安装程序。%n%n%n%n%n%n%n%n本程序由KAKA制作%n%n欢迎朋友们访问KAKA的Blog:%n%n
http://blog.sina.com.cn/nimokaka%n%n http://hi.baidu.com/kakanimo
具体脚本我上传了,见:http://www.rayfile.com/zh-cn/files/ea691794-7984-11e0-b714-0015c55db73d/
加载中,请稍候......