0

今天是个好日子。我分配的任务包括创建简单的仅安装脚本项目,该项目应该有 2 个窗口:首先将提示用户输入路径并在此指定位置创建文本文件,而第二个将提示输入文本并保存用户编写的任何内容到这个文本文件中。

有趣的一点是,我有少量的 installshield 经验(完成了教程……嗯,是的,仅此而已),除此之外,我的编程经验也很少。据我了解,我应该首先创建两个自定义对话框窗口(例如通过从标准对话框中克隆它们),然后创建带有函数的 .rul 文件,确定每个对话框的行为。之后,将它们包含在主 setup.rul 中并在特定时间点调用函数。

问题是 - 什么样的对话窗口/功能/时间点最适合此类任务?作为参考,我搜索了“序列号验证示例项目”,但老实说,它自定义默认窗口的方式让我更加困惑......所以,请有人帮忙吗?谢谢你。

4

1 回答 1

1

为了将来参考,这里是工作解决方案。

在 flexera 论坛上问了同样的问题,这就是我得到的:

在我的脑海中(没有 InstallShield 方便检查) 1)创建一个 InstallScript 项目,只需接受新项目向导中的所有默认值,除非您想添加本地化或其他内容。2) 您的描述暗示您不需要维护(修理、修改、卸载)支持。如果正确,请转到 Project\Settings 并在“维护”选项卡上选择“不卸载或维护”。3)您可以将代码放在 OnFirstUIBefore 函数的顶部,然后调用 Exit 以便永远不会执行其余的默认代码,因为您没有安装任何东西。

作为 InstallShield IDE 的一部分,开始菜单(适用于 IS2012 Spring)中有一个工具,用于演示所有内置对话框。您可以浏览这些选项并选择最适合您情况的对话框。听起来你想要:

调用 AskPath 或 SdAskDestPath(还有其他几种可能)

然后调用 AskText 并保存该字符串。

如果您需要对默认对话框进行布局或文本更改,请查看您的对话框视图并选择您在上面选择的任何对话框并进行编辑。(如果您决定使用皮肤,请确保在更改任何对话框布局之前选择皮肤。)

然后做一些类似于 WriteLine 示例的功能体http://kb.flexerasoftware.com/doc/Helpnet/installshield14langref/LangrefWriteLine_Example.htm

实际的 WriteLine 示例函数原型用于 MSI 自定义操作,这不是您想要的。忽略函数 protoype,只使用项目中的代码在您已经收集的路径处创建文件并编写您收集的文本行。

然后调用Exit;

(非常感谢用户 phill_mn 的回答)

这是 setup.rul 的代码:

#include "ifx.h"

function OnFirstUIBefore()
    number nvFileHandle;
    string  svResult;
    string  szTargetPath, szFeatures;
    BOOL bLicenseAccepted;

begin   

AskPath ("Please choose a path where text file will be saved","c:\\",szTargetPath);

MessageBox("File yourtext.txt wiil be created or overwritten at " +szTargetPath, INFORMATION);

AskText ("Please enter some text to save into that file", "Text goes here", svResult); 

OpenFileMode (FILE_MODE_APPEND);

   if (CreateFile (nvFileHandle, szTargetPath, "yourtext.txt") < 0) then 
        MessageBox ("Creating failed.", SEVERE); 
        abort; 
   else 

        if (WriteLine(nvFileHandle, svResult) < 0) then 
            MessageBox ("Writing failed.", SEVERE); 
        else 
            MessageBox ("Success.", INFORMATION); 
        endif; 

    endif; 

    CloseFile (nvFileHandle); 

Do(EXIT); 

    return 0;
end;
于 2013-07-02T17:47:09.107 回答