举个简单的例子:安装过程中选择CAD版本安装,安装后安装文件中释放的某DLL随CAD启动加载。 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] |