加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2011-05-08 23:12:25)
标签:

杂谈

分类: 安装部署


  目前打包的程序比较多,打包的方法也多,本人把使用
Inno打包CAD二次开发程序的过程和大家分享下。(之前也截了点图:http://blog.sina.com.cn/s/blog_69e8fdf00100oqmr.html,不过那里面最后的脚本是修改之前的,本篇的脚本见文末)大家讨论讨论。

举个简单的例子:安装过程中选择CAD版本安装,安装后安装文件中释放的某DLLCAD启动加载。

由于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/

0

阅读 收藏 喜欢 打印举报/Report
前一篇:淑熙 啦啦啦
后一篇:小宝满月酒
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有