我在 DLL 中有两个 C 函数,它们在定义文件中定义,并导出以在 Inno Setup 中使用。
char* __stdcall GetName()
{
return "Kishore";
}
void __stdcall getName(char* strName)
{
strcpy(strName, "Kishore");
}
Run Code Online (Sandbox Code Playgroud)
Inno Setup 代码将加载自定义 DLL 并调用函数/过程来返回名称
{ Inno Setup script }
[Code]
procedure getName(MacAddress: String);
external 'getName@files:MyDll.dll stdcall setuponly';
function GetName():PAnsiChar;
external 'GetName@files:MyDll.dll stdcall setuponly';
function NextButtonClick(CurPage: Integer): Boolean;
var
StrName: String;
begin
SetLength(StrName,15);
getName(StrName); { displaying only single character }
StrName := GetName(); { this call is crashing }
end
Run Code Online (Sandbox Code Playgroud)
如何在 Inno Setup 脚本中检索名称而不崩溃?
我正在处理 Inno Setup 项目。SaveStringToFile该项目正在使用 部分中的函数写出一个文件[Code]。我想将此文件设置为隐藏系统文件,但我无法找到有关如何实现此操作的信息。有任何想法吗?
我正在使用 Inno Setup。
\n\n如果 Windows 版本是 32 位,有人可以告诉我如何终止安装吗?
\n\n或者更具体地说,当安装开始时,代码会检查 Windows 版本是否为 32 位并显示警告,然后取消安装。
\n\n完全终止安装程序的命令是什么\xe2\x80\x99?
\n\n我正在使用以下过程
\n\nprocedure CheckWindows;\nbegin\n if not IsWin64 then\n begin\n MsgBox(\'Error:The Windows version is 32bit\',mbError,MB_OK);\n WizardForm.Close;\n end;\nend;\nRun Code Online (Sandbox Code Playgroud)\n\n它确实给出了警告消息,但随后它允许用户根据需要继续。
\n\n如何彻底终止安装?
\n如题,有可能吗?而且,如果参数(例如传递给 exe 文件的参数)设置为 true,我想将它们显示在安装程序的一页上。
\n\n我知道如何显示某些页面:
\n\nif dev then\n PageWersjePlikow :=\n CreateOutputMsgMemoPage(\n 1, \'Wersje plik\xc3\xb3w zawarte w instalatorze\',\n \'Lista plik\xc3\xb3w niewidoczna dla klienta\',\n \'Pliki:\', \'TU WPISA\xc4\x86 WERSJE PLIK\xc3\x93W\');\nRun Code Online (Sandbox Code Playgroud)\n\n我有一些想法,但每个想法都是基于编译 exe 安装程序时构建的 .txt 文件,然后从中读取......
\n我得到了以下小函数,在[Files]复制该部分的所有文件后需要调用它
procedure DllAfterInstall(platform: Integer);
begin
if not installDriver(platform) then
MsgBox(ExpandConstant('{cm:installDriverFail}'), mbError, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)
installDriver(platform)我的 dll 之一的外部函数在哪里。
一旦我尝试调用DllAfterInstall该[Run]部分中的函数,例如
Filename: "{code:DllAfterInstall}"; Parameters: 0; Check: not IsWin64
Run Code Online (Sandbox Code Playgroud)
我收到错误
“DllAfterInstall”的原型无效
那么谁能告诉我我做错了什么?或者也许有另一种方法可以*.dll在复制所有文件后调用 a ?该*.dll函数只能被调用一次,所以AfterInstall没有选择。
我有一个 Inno Setup 安装程序的组件列表,有 19 个不同的选项,我想OnClick为其中一个组件设置事件。有没有办法做到这一点?OnClick或者如果为所有组件设置了事件,是否有方法检查哪个组件触发了事件?
目前,该OnClick事件设置如下:
Wizardform.ComponentsList.OnClick := @CheckChange;
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
Wizardform.ComponentsList.Items[x].OnClick := @DbCheckChange;
Run Code Online (Sandbox Code Playgroud)
被WizardForm.ComponentList声明为:TNewCheckListBox
卸载时使用以下代码
BitmapImage := TBitmapImage.Create(InstallTopPanel);
BitmapImage.AutoSize := True;
BitmapImage.Bitmap.LoadFromFile(
ExpandConstant( '{tmp}\WizardSmallImageFile.bmp') );
BitmapImage.Parent := InstallTopPanel;
BitmapImage.Top := (InstallTopPanel.ClientHeight - 58) / 2;
BitmapImage.Left := InstallTopPanel.ClientWidth - 55 - 10;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
异常:无法打开文件。C:\users\xyz\AppData\Local\Temp\is-U3Q8P.tmp\WizardSmallImageFile.Bmp。文件未找到。
我还尝试ExtractTemporaryFile在调用之前使用LoadFromFile卸载过程中不支持的功能。
ExtractTemporaryFile('WizardSmallImageFile.bmp');
Run Code Online (Sandbox Code Playgroud)
那么问题来了,如何查看图像或特别WizardSmallImageFile是在卸载过程中?
我上面的代码构建了一个带有自定义面板的自定义表单。就像这里:Inno Setup 仅卸载一些组件。
我有一个.inf从 Resource Hacker 导出的文件。该文件采用 UTF-16 LE 编码。
EXTRALARGELEGENDSII_INI TEXTFILE "Data.bin"
LARGEFONTSLEGENDSII_INI TEXTFILE "Data_2.bin"
NORMALLEGENDSII_INI TEXTFILE "Data_3.bin"
THEMES_INI TEXTFILE "Data_4.bin"
Run Code Online (Sandbox Code Playgroud)
当我使用该LoadStringFromFile函数加载它时:
EXTRALARGELEGENDSII_INI TEXTFILE "Data.bin"
LARGEFONTSLEGENDSII_INI TEXTFILE "Data_2.bin"
NORMALLEGENDSII_INI TEXTFILE "Data_3.bin"
THEMES_INI TEXTFILE "Data_4.bin"
Run Code Online (Sandbox Code Playgroud)
我在调试输出中得到这个:
E
Run Code Online (Sandbox Code Playgroud)
请告诉我如何解决这个问题。
提前致谢。
我觉得这一定是我所缺少的一些简单的东西 - 在 Inno Setup 中,如果我传入了指令变量,我如何在该[Code]部分中使用它?
假设我传入/DMYVAR=1Inno Setup 引擎。
在我的 .iss 文件中,我可以有类似的内容:
[Setup]
AppName=MyApp v{#MYVAR}
Run Code Online (Sandbox Code Playgroud)
在我的部分中,[Code]我希望能够像这样使用它:
[Setup]
AppName=MyApp v{#MYVAR}
Run Code Online (Sandbox Code Playgroud)
这不起作用:(
这是一个标准 RTF 文档,用于Inno Setup 部分LicenseFile中的属性:[Setup]
是否可以在此页面添加一个打印按钮来触发打印许可协议?
我看到了一个类似的问题和答案(在 Inno Setup 中的许可证页面中添加“打印协议”按钮),我刚刚尝试实现。但这就是我得到的:
该按钮位于错误的位置,因此此代码似乎与 Inno Setup 6 不完全兼容?
所以,在我的脚本中我有:
[Setup]
LicenseFile=..\..\..\EULA\EULA.rtf
[Code]
var PrintButton: TButton;
procedure PrintButtonClick(Sender: TObject);
var ResultCode :integer;
begin
log('test');
ExtractTemporaryFile('EULA.rtf');
//if not ShellExec('Print', ExpandConstant('{tmp}\EULA.rtf'),
// '', '', SW_SHOW, ewNoWait, ResultCode) then
if not ShellExec('', ExpandConstant('{tmp}\EULA.rtf'),
'', '', SW_SHOW, ewNoWait, ResultCode) then
log('test');
end;
procedure InitializeWizard();
begin
PrintButton := TButton.Create(WizardForm);
PrintButton.Caption := '&Print...';
PrintButton.Left := WizardForm.InfoAfterPage.Left + 96;
PrintButton.Top := WizardForm.InfoAfterPage.Height + 88;
PrintButton.OnClick := …Run Code Online (Sandbox Code Playgroud)