Inno Setup中AppData\LocalLow的常量吗? [英] Constant for AppData\LocalLow in Inno Setup?

查看:434
本文介绍了Inno Setup中AppData\LocalLow的常量吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当前要访问 LocalLow ,我使用此方法:

Currently to access LocalLow I use this:

{%USERPROFILE}\AppData\LocalLow

但是我想知道Inno Setup中是否存在常量,因为两个漫游 Local 有一个。

But I would like to know if there's a constant for that in Inno Setup, since both Roaming and Local have one.

推荐答案

AppData\LocalLow 没有常量。

您可以使用Pascal脚本来解决它。

You may use Pascal Scripting to resolve it.

要解决 LocalLow,必须使用 SHGetKnownFolderPath

另请参见检测AppData\LocalLow的位置

To resolve the "LocalLow", one has to use SHGetKnownFolderPath.
See also Detect the location of AppData\LocalLow.

由于Unicode Inno Setup中缺少(宽) PChar 类型。

The implementation involves few hacks, due to a lack of (wide) PChar type in Unicode Inno Setup.

const
  MAX_PATH = 260;
  AppDataLocalLowGUID = '{A520A1A4-1780-4FF6-BD18-167343C5AF16}';

{ There's no PChar in Unicode Inno Setup, }
{ pretend the function returns a pointer to an Integer }
function SHGetKnownFolderPath(rfid: TGUID; dwFlags: DWORD; hToken: THandle;
  var ppszPath: Integer): Integer;
  external 'SHGetKnownFolderPath@Shell32.dll stdcall';

{ And allow the Integer to be copied to string }
function StrCpy(Dest: string; Source: Integer): Integer;
  external 'StrCpyW@Shlwapi.dll stdcall';

{ And allow the Integer pointer to be released }
procedure CoTaskMemFreeAsInteger(pv: Integer);
  external 'CoTaskMemFree@Ole32.dll stdcall';

function GetAppDataLocalLow: string;
var
  Path: Integer;
  I: Integer;
begin
  if SHGetKnownFolderPath(StringToGUID(AppDataLocalLowGUID), 0, 0, Path) = 0 then
  begin
    { The path should not be longer than MAX_PATH }
    SetLength(Result, MAX_PATH);

    StrCpy(Result, Path);

    CoTaskMemFreeAsInteger(Path);

    { Look for NUL character and adjust the length accordingly }
    SetLength(Result, Pos(#0, Result) - 1);
  end;
end;






如果您需要在非代码部分(在Pascal脚本之外),您可以使用脚本常量


If you need to use the path in non-Code section (outside of the Pascal Script), you can use a scripted constant:

[Files]
Source: myfile.txt; DestDir: {code:GetAppDataLocalLow}

您需要更改函数签名以获取虚拟参数:

And you need to change the function signature to take a dummy parameter:

function GetAppDataLocalLow(Param: string): string;

这篇关于Inno Setup中AppData\LocalLow的常量吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆