InstallShield有关的摘录

1.如何获得安装目标盘剩余空间:

//用prototype关键字声明函数
prototype CheckDiskSpace();  
//常量定义:其中#define是宏定义命令,它的作用是将TARGETDISK用DISK_DRIVE来代替;DISK_DRIVE称为宏名
#define DISK_DRIVE TARGETDISK
  
function CheckDiskSpace() 

//变量申明
    STRING szDrive,svString;
    NUMBER nSpace,nResult; 

2. 在非Web Project工程中,如何用简单的方法实现安装时IIS的检测(适用于ISX,10.5,11,11.5):

新建一个Web Project,切换到Installation Designer->System search处,在右边的列表中右击,选择publish Wizard(发布向导),按向导提示进行发布。

3.运行其他安装程序:

可以在主安装程序下运行其他的安装程序。在选择的每个子安装程序都运行完毕后,主安装程序才会结束运行。有两种方法可以实
现这一功能:
    1.调用Dolnstall
    启动由InstallShield生成的安装程序的较好的办法是如下调用DoInstall函数:
   (1)为要启动的子安装程序建立一个完整的安装工程;所有由InstallShield生成的文件
对子安装程序的正常运行都是必需的。
    (2)在已启动的主安装工程中,把所有为子安装程序生成的文件放在Setup Files面板
下适当的surportfiles文件夹中。
     提示:给子安装程序的setup.inx一个区别于setup.inx的文件名。
   (3)在父安装脚本调用DoInstall函数。
    例如:

DoInstall (SUPPORTDIR^"child.inx""", WAIT);

4.创建internet快捷方式:

实现方法:随便建一个快捷方式:修改刚刚添加的快捷方式的属性,主要修改Target和Arguments两项。将Target的内容改为[ProgramFilesFolder]Internet Explorer/IEXPLORE.EXE,即将快捷方式指向IE,然后将Arguments修改为网址,不过在installscript可以直接建internet快捷方式了,不知为什么其他工程却无此功能。

5.怎么在安装时不显示当前正在复制的文件名:

方法很简单,只用在Dlg_sdStart Copy对话框的reture 0;前加上以下语句:Disable(INDVFILESTATUS);//用于控制进度条左上当前安装文件显示与否;

6.可以在script编辑界面按下Ctrl+I键打开函数向导对话框

7.怎样设置安装协议

在Installation Designer页面:Bahavior and Logic->Support Files面板中,在合适的目标语言和平台下放置license文件。然后在installscript处修改Dlg_SdLicense对话框对安装协议的调用脚本。Dlg_SdLicense:   //阅读安装协议。

   szLicenseFile = SUPPORTDIR ^ "license.txt";
    szTitle    
= "";
    szMsg      
= "";
    szQuestion 
= "";
    nResult    
= SdLicense( szTitle, szMsg, szQuestion, szLicenseFile );
    
if (nResult = BACK) goto Dlg_SdWelcome; 

8.IS中调用DLL的问题解决过程

原文出处:InstallShield 中文论坛
原文地址:http://installshield.jaron.cn/forum/dispbbs.asp?boardID=3&ID=285266&page=1
原文作者:upselfever

背景:要求软件在安装时验证授权号,并且一个授权号只能在一台机器上使用。
解决方法:安装时读取机器的硬件ID(CPU),根据硬件ID计算生成授权号。安装时检测用户输入的授权号,和计算生成的授权号是否一致。
技术实现:通过VC++编写DLL,提供两个接口函数,GetCPU_ID(),GetSerialNumber().然后在IS中加载这个DLL,然后调用这两个函数取得CPU的ID,然后生成合法授权号。
遇到的问题:加载开发人员提供的DLL,成功。但是在调用DLL提供的函数,IS报出0x80040703的错误:提示找不到上述的两个函数。
解决过程:由于在IS中调用dll并使用其中的函数,这个过程没有什么变化,所以,问题就定位在DLL上面。下面简述在IS中加载DLL的方法。

              首先:将DLL文件添加在IS的SUPPORTDIR目录下,就是许可协议文件放的那个目录。

              然后:在脚本文件的开头声明两个函数

                         prototype NUMBER MyDLL.GetCPU_ID();

                         prototype NUMBER MyDLL.GetSerialNumber(NUMBER);

              其次:我在function中开始加载DLL

                         nResult=UseDLL(SUPPORTDIR^MyDLL.dll);

                         判断nResult的值来看看是否加载成功,如果加载成功则

                         nCPUID=GetCPU_ID();   结果就在这个地方,报出了无法找到MyDLL.GetCPU_ID函数的错误。

以上的文件加载和函数声明调用过程很容易从IS的帮助文档中找到,或者从网上搜的到。应该不会有太大问题。问题肯定出在了DLL上。

-------dll部分修改过程-------------

        原DLL中,函数声明格式如下:

        extern "C" _declspec(dllexport) int GetCPU_ID();

        extern "C" _declspec(dllexport) int GetSerialNumber(int cpu_id);

后经过若干查找,咨询,改为:
        
        extern "C" _declspec(dllexport)  int __stdcall  GetCPU_ID(); //标准调用

        extern "C" _declspec(dllexport) int __stdcall  GetSerialNumber(int cpu_id);

并使用.def文件,定义接口函数的名称

LIBRARY MyDLL

        EXPORTS
        GetCPU_ID
        GetSerialNumber

如此,再编译生成MyDLL.dll文件

--------i修改过程-------------------

修改IS中函数声明
        
          prototype stdcall NUMBER MyDLL.GetCPU_ID();

          prototype stdcall NUMBER MyDLL.GetSerialNumber(NUMBER);


          .....

          function ******()
          
          number  nCPUID;
          ..........


          begin

             nResult=UseDLL(SUPPORTDIR^MyDLL.dll);
             if nResult=0 then
             MessageBox("动态库加载成功",INFORMATION);
             nCPUID=GetCPU_ID();
             .....
          else
             MessageBox("动态库加载失败",INFORMATION);
             abort;
          endif
          ....
          end


成功!!!

-----提醒-----------------

根据在其它论坛搜索到的知识,如果动态库是用VB或其它工具开发的,则调用方法又不相同。

用VC++开发的动态库在函数声明使,光使用extern "C"关键字是不够的,这样只是保证了用C可以正确调用,而用其它工具,比如DELPHI就不可以。还要使用DEF文件,对函数名称进行声明。

关于是否必须使用stdcall关键字,我没有进行试验,但是,使用这个关键字,是可以成功调用的。

具体动态库的知识,由于本人不是程序员,不能保证说明正确,只保证结果正确。

 

 

尊重他人劳动成果,转载请注明出处

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章