// 用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函数。
例如:
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: //阅读安装协议。
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关键字,我没有进行试验,但是,使用这个关键字,是可以成功调用的。
具体动态库的知识,由于本人不是程序员,不能保证说明正确,只保证结果正确。
尊重他人劳动成果,转载请注明出处