在Inno Setup中调试时如何查看变量值?如何打印一些东西来调试输出?
谢谢
如果需要特权提升,Inno Setup安装程序具有可用于控制安装程序启动时的PrivilegesRequired指令.我希望我的安装程序甚至可以为非管理员用户工作(没有问题将我的应用程序安装到用户文件夹,而不是Program Files).所以我设置PrivilegesRequired为none(未记录的值).这使得UAC仅为管理员用户提示弹出,因此他们甚至可以安装到Program Files.没有UAC提示非管理员用户,所以即使他们可以安装应用程序(到用户文件夹).
这有一些缺点:
是否有一些方法可以在需要时(当用户选择仅由管理员帐户写入的安装文件夹时)使Inno Setup请求权限提升?
我假设在Inno Setup中没有这个设置.但可能有一个程序化的解决方案(Inno Setup Pascal脚本)或某种插件/ DLL.
请注意,即将推出的Inno Setup 6具有对非管理安装模式的内置支持.
我正在使用InnoSetup创建一个安装程序,并在一个[Code]部分中编写一些自定义处理程序.在其中一个处理程序中,我希望能够检索AppName该[Setup]部分中定义的(或者,可能是其他参数的值)的值.有没有办法让我这样做?我看过文档,但我没有找到任何可以让我这样做的东西.我们的InnoSetup文件实际上是由我们的构建过程生成的,它将所有程序和程序特定的片段拼接在一起,因此必须在代码中为每个程序定义常量是不方便的.有没有方便的方法呢?
我正在寻找类似的东西
MyString := ExpandConstant('{AppName}');
Run Code Online (Sandbox Code Playgroud)
除了{AppName}不是定义的常数.有没有办法查询该[Setup]部分中定义的参数?
我使用此代码来了解密钥是否存在:
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk') then
begin
MsgBox('Key exists!!', mbInformation, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)
对于这个例子,它有效,我有消息框,但有了它,它没有:
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk\Maya') then
begin
MsgBox('Key exists!!', mbInformation, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)
但是"Maya"键存在于我的电脑上.有谁能够帮我 ?
编辑:
实际上,似乎inno-setup不能访问正确的键...例如,使用此代码我列出了所有子键Maya,但是(!)结果是所有子键HKEY_LOCAL_MACHINE\SOFTWARE...
if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'SOFTWARE', Names) then
begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S := S + Names[I] + #13#10;
MsgBox('List of subkeys:'#13#10#13#10 + S, mbInformation, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)
为什么这个HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node关键?
我看过以下帖子.我的代码看起来完全相同,但不起作用:
Inno Setup检查运行过程
我从http://www.vincenzo.net/isxkb/index.php?title=PSVince复制了这个例子
但是这个例子也不起作用,即使我改变了这样的代码:
[Code]
function IsModuleLoaded(modulename: AnsiString): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall';
Run Code Online (Sandbox Code Playgroud)
代码总是返回false(程序没有运行,即使它正在运行).在Windows 2008 R2和Windows 7上测试过.
事实上我想检查,如果它tomcat5.exe正在运行.所以我想我不能用AppMutex.
我也看过https://code.google.com/p/psvince/source/detail?r=5
但我找不到有关该DLL兼容性的任何事实.
完整代码:
[Files]
Source: psvince.dll; Flags: dontcopy
[Code]
function IsModuleLoaded(modulename: AnsiString ): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall';
function InitializeSetup(): Boolean;
begin
if(IsModuleLoaded( 'notepad.exe' )) then
begin
MsgBox('Running', mbInformation, MB_OK);
Result := false;
end
else
begin
MsgBox('Not running', mbInformation, MB_OK);
Result := true;
end
end;
Run Code Online (Sandbox Code Playgroud) 我正在尝试更新我的一个脚本以使用Inno Setup的Unicode版本.不幸的是我遇到了一个问题,StringChangeEx期望看到一个unicode String而不是我需要的AnsiString(不匹配的类型).是否有另一种方法可以从Unicode Inno Setup中替换匹配的AnsiStrings?
我正在使用WizardDirValue()以避免必须一直打字ExpandConstant('{app}\'),万一有人想知道为什么.
var
AnsiData: AnsiString;
begin
LoadStringFromFile(WizardDirValue() + '\legacyansi.conf', AnsiData)
{ Type mismatch, StringChangeEx expects String which is Unicode }
StringChangeEx(AnsiData, 'current', 'replace', True);
SaveStringToFile(WizardDirValue() + '\legacyansi.conf', AnsiData)
end;
Run Code Online (Sandbox Code Playgroud) 大家好
我怎样才能使用Inno设置获取用户的本地IP地址?我认为使用win32 api GetIpAddrTable,但目前还不清楚如何进行调整.有人有其他任何方式吗?或者知道怎么做?坦克
我正在我的Inno安装程序安装程序中进行验证,以检查计算机上是否安装了Microsoft更新,如果没有,我会显示一个简单的消息框,告诉用户需要更新,这是消息代码:
MsgBox(
'Your system requires an update supplied by Microsoft. ' +
'Please follow this link to install it: ' +
'http://www.microsoft.com/downloads/details.aspx?FamilyID=1B0BFB35-C252-43CC-8A2A-6A64D6AC4670&displaylang=en',
mbInformation, MB_OK);
Run Code Online (Sandbox Code Playgroud)
我想让URL成为网页的超链接,但我无法弄清楚如何在Inno Setup中添加文本作为超链接?
谢谢.
自从我上次在Pascal写作以来已经有20年了.我似乎无法正确使用语言的结构元素,而不是使用begin和end的块.例如,这给我一个编译器错误"标识符预期"
procedure InitializeWizard;
begin
Log('Initialize Wizard');
if IsAdminLoggedOn then begin
SetupUserGroup();
SomeOtherProcedure();
else begin (*Identifier Expected*)
Log('User is not an administrator.');
msgbox('The current user is not administrator.', mbInformation, MB_OK);
end
end;
end;
Run Code Online (Sandbox Code Playgroud)
当然,如果我删除if then块和begin与它们相关的块,那么一切都OK.
有时我会得到这种语法,并且它可以正常运行,但是在嵌套end块时问题会变得恼怒.
解决这个问题还不够.我想更好地了解如何使用这些块.我显然错过了一个概念.来自C++或C#的东西可能正在从我的另一部分中悄悄进入并弄乱我的理解.我已经阅读了一些关于它的文章,我认为我理解它然后我没有.
我正在使用Inno setup studio编写一个pascal函数,它检查对象是否为null并执行某些操作
到目前为止我有:
XMLDocument.setProperty('SelectionLanguage', 'XPath');
XMLNode := XMLDocument.selectSingleNode(APath);
if (XMLNode=Null) then
begin
//do stuff
End
Else
//do other stuff
End
Run Code Online (Sandbox Code Playgroud)
但我一直在收到invalid variant operation错误.
如何在Inno Setup Pascal脚本代码中检查对象是否为空?
inno-setup ×10
pascalscript ×10
delphi ×2
installer ×2
32bit-64bit ×1
ansi ×1
debugging ×1
hyperlink ×1
messagebox ×1
pascal ×1
privileges ×1
registry ×1
uac ×1
unicode ×1
winapi ×1
windows ×1