Inno setup 如何将数据写入服务器上的安装程序?

Inno setup 如何将数据写入服务器上的安装程序?,inno-setup,Inno Setup,我的处境很复杂。 网上有一个指向我的安装程序的可下载链接。 在任何人下载安装程序之前,他们必须在浏览器中填写表格。 我想将表格中填写的信息保存在安装程序中。 我如何才能做到这一点? *每次有人填写表单时,都不能在服务器上编译安装程序,因为安装程序非常繁重,而且这个过程会花费很多时间。 *在安装程序中创建表单不是一个选项。 *我只需要在可执行文件中保存一个数字。这是一个有趣的问题。在这件事上我支持特拉玛。当安装程序已经生成时,您唯一的机会就是修改应用程序/可执行资源 像这样的工具可能有助于自动化此

我的处境很复杂。
网上有一个指向我的安装程序的可下载链接。
在任何人下载安装程序之前,他们必须在浏览器中填写表格。
我想将表格中填写的信息保存在安装程序中。
我如何才能做到这一点?
*每次有人填写表单时,都不能在服务器上编译安装程序,因为安装程序非常繁重,而且这个过程会花费很多时间。
*在安装程序中创建表单不是一个选项。

*我只需要在可执行文件中保存一个数字。

这是一个有趣的问题。在这件事上我支持特拉玛。当安装程序已经生成时,您唯一的机会就是修改应用程序/可执行资源

像这样的工具可能有助于自动化此任务

在服务器端,您可以使用PHP接受表单数据,然后将其转发给ResourceHacker,由wine和PHP执行,例如:

exec(“wine ResourceHacker.exe-脚本文件”)

您可以选择如何将数据从表单传递到ResourceHacker:cli参数、从文件等。为了在服务器端实现自动化,我建议使用脚本文件

ScriptFile
的开头可能类似于

[FILENAMES]
Exe=Installer.exe
SaveAs=ModifiedInstaller.exe
Log=file.log

[COMMANDS]
-modify       ResourceSrc, ResourceMask
为了找到要更改的元素,您可以在Windows系统上使用ResourceHacker GUI,一直玩到它工作为止,然后在服务器端相应地更改脚本以实现自动化


好的,在解释了如何修改资源之后,让我们进入详细内容:

正如我所指出的,也可以使用语言字符串进行修改,但我将逐步说明如何在可执行文件的VERSION_INFO部分插入新字段。为了测试的目的,我工作
\innosetup\Examples\MyProg.exe

我们的目标是添加一个带有序列号的新值“PrivateBuild”

(根据,还有“评论”和“特殊构建”来输入信息。)

1。将MyProg.exe中的版本信息提取到VersionInfo.rc中

ResourceHacker.exe-提取MyProg.exe、VersionInfo.rc、VersionInfo、,

VersionInfo.rc
的内容如下所示:

1 VERSIONINFO
FILEVERSION 1,5,0,0
PRODUCTVERSION 1,5,0,0
FILEOS 0x4
FILETYPE 0x0
{
BLOCK "StringFileInfo"
{
    BLOCK "040904b0"
    {
        VALUE "CompanyName", "My Company"
        VALUE "FileDescription", "My Program"
        VALUE "FileVersion", "1.5.0.0"
        VALUE "InternalName", "MyProg"
        VALUE "LegalCopyright", "Copyright (C) My Company"
        VALUE "OriginalFilename", "MyProg.exe"
        VALUE "ProductName", "My Program"
        VALUE "ProductVersion", "1.5"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409, 0x04B0
}
}
1 VERSIONINFO
FILEVERSION 1,5,0,0
PRODUCTVERSION 1,5,0,0
FILEOS 0x4
FILETYPE 0x0
{
BLOCK "StringFileInfo"
{
    BLOCK "040904b0"
    {
        VALUE "CompanyName", "My Company"
        VALUE "FileDescription", "My Program"
        VALUE "FileVersion", "1.5.0.0"
        VALUE "InternalName", "MyProg"
        VALUE "LegalCopyright", "Copyright (C) My Company"
        VALUE "OriginalFilename", "MyProg.exe"
        VALUE "ProductName", "My Program"
        VALUE "ProductVersion", "1.5"
        VALUE "PrivateBuild", "123-123-123"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409, 0x04B0
}
}
2。修改版本信息

我们在
VersionInfo.rc

值“PrivateBuild”,“123-123-123”

(稍后:使用PHP修改该文件。可能会对包含ProductVersion的行进行preg_匹配,并在值行后面追加一个新行。)

VersionInfo.rc的新内容如下所示:

1 VERSIONINFO
FILEVERSION 1,5,0,0
PRODUCTVERSION 1,5,0,0
FILEOS 0x4
FILETYPE 0x0
{
BLOCK "StringFileInfo"
{
    BLOCK "040904b0"
    {
        VALUE "CompanyName", "My Company"
        VALUE "FileDescription", "My Program"
        VALUE "FileVersion", "1.5.0.0"
        VALUE "InternalName", "MyProg"
        VALUE "LegalCopyright", "Copyright (C) My Company"
        VALUE "OriginalFilename", "MyProg.exe"
        VALUE "ProductName", "My Program"
        VALUE "ProductVersion", "1.5"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409, 0x04B0
}
}
1 VERSIONINFO
FILEVERSION 1,5,0,0
PRODUCTVERSION 1,5,0,0
FILEOS 0x4
FILETYPE 0x0
{
BLOCK "StringFileInfo"
{
    BLOCK "040904b0"
    {
        VALUE "CompanyName", "My Company"
        VALUE "FileDescription", "My Program"
        VALUE "FileVersion", "1.5.0.0"
        VALUE "InternalName", "MyProg"
        VALUE "LegalCopyright", "Copyright (C) My Company"
        VALUE "OriginalFilename", "MyProg.exe"
        VALUE "ProductName", "My Program"
        VALUE "ProductVersion", "1.5"
        VALUE "PrivateBuild", "123-123-123"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409, 0x04B0
}
}
3。编译版本信息

windres-i VersionInfo.rc-o VersionInfo.res-o res

现在,VersionInfo文本再次成为一种资源

4。将资源插入exe

ResourceHacker.exe-脚本ScriptFile.rh

其中
ScriptFile.rh
包含

[FileNames]
Exe=MyProg.exe
SaveAs=MyProgNew.exe
Log=MyProg.log

[Commands]
-delete VERSIONINFO,1,1033
-add VersionInfo.res, VERSIONINFO,1,1033
让我们查看日志:

[08 Sep 2015, 11:21:33]

[FileNames]
Exe=MyProg.exe
SaveAs=MyProgNew.exe
Log=MyProg.log

[Commands]
-delete VERSIONINFO,1,1033
  Deleted: VERSIONINFO,1,1033
-add VersionInfo.res, VERSIONINFO,1,1033
  Added: VERSIONINFO,1,1033

Done.
好的。。。插入了新版本信息

5。如何使用或从InnoSetup中提取值?

InnoSetup只提供一个名为 所以不能用

#定义串行GetStringFileInfo(“path/to/MyProgNew.exe”,“PrivateBuild”)

因此,我们必须找到一个解决方法来访问这些信息,这很可能使用WinAPI。这里有一种方法可以做到这一点,它有一些改进的空间。它是作者写的

[代码]
#ifdef UNICODE
#定义“W”
#否则
#定义“A”
#恩迪夫
函数GetFileVersionInfoSize(lptstrFilename:String;lpdwHandle:Integer):整数;
外部“GetFileVersionInfo大小{#A}@version.dll stdcall delayload”;
函数GetFileVersionInfo(lptstrFilename:String;dwHandle,dwLen:Integer;var lpData:Byte):布尔;
外部“GetFileVersionInfo{#A}@version.dll stdcall delayload”;
函数VerQueryValue(var-pBlock:Byte;lpSubBlock:String;var-lpbuffer:DWord;var-puLen:Integer):布尔;
外部“VerQueryValue{#A}@version.dll stdcall delayload”;
函数GetFileVerInfo(文件名,VerName:String):String;
//VerName:
//注释、法律版权、公司名称、文件描述、文件版本、产品版本、,
//InternalName、LegalTrademarks、OriginalFilename、ProductName、PrivateBuild、SpecialBuild
变量
dwLen,puLen,i:整数;
lpFileVerInfo:字节数组;
lpbuffercp,lpbuffervn:DWord;
LangCodepage:字符串;
开始
结果:='';
如果文件存在(文件名),则
开始
dwLen:=getFileVersionInfo大小(文件名,0);
如果dwLen>0,则
开始
SetArrayLength(lpFileVerInfo,dwLen);
如果GetFileVersionInfo(文件名,0,dwLen,lpFileVerInfo[0]),则
开始
如果VerQueryValue(lpFileVerInfo[0],'\VarFileInfo\Translation',lplpBufferCP,puLen),则
开始
LangCodepage:=格式('%.2x%.2x%.2x%.2x',[lpFileVerInfo[(dwLen div 2)-5],lpFileVerInfo[(dwLen div 2)-6],lpFileVerInfo[(dwLen div 2)-3],lpFileVerInfo[(dwLen div 2)-4];
如果VerQueryValue(LPFileVeriInfo[0],格式(\%s\%s\%s',['StringFileInfo',LangCodepage,VerName]),lplpBufferVN,puLen),则
开始
i:=(dwLen div 2)+lpbuffervn-lpbuffercp-6;
重复
如果lpFileVerInfo[i]0,则
开始
设置长度(结果),长度(结果)+1;
结果[长度(结果)]:=Chr(lpFileVerInfo[i]);
结束;
i:=i+1;
#ifdef UNICODE
直到i>(dwLen div 2)+lpbuffervn-lplpBufferCP-8+puLen;
#否则
直到lpFileVerInfo[i]=0;
#恩迪夫
结束;
结束;
结束;
结束;
结束;
结束;
然后
GetFileVerInfo(ExpandConstant({srceexe}'),“PrivateBuild”)

6。在安装程序上签名

更新我的资源会破坏我对安装程序的代码签名吗

是的,插页会改变