Константа для AppData\LocalLow?

В настоящее время для доступа к LocalLow я использую это:

{%USERPROFILE}\AppData\LocalLow

Но я хотел бы знать, есть ли установленная константа для этого в INNO, так как оба Roaming а также Local Имеется.

2 ответа

Решение

Там нет константы для AppData\LocalLow,

Вы можете использовать Pascal Scripting, чтобы решить эту проблему.

Чтобы разрешить "LocalLow", нужно использовать SHGetKnownFolderPath,
См. Также Определение местоположения AppData \ LocalLow.

Реализация включает в себя несколько взломов, из-за отсутствия (широкий)PCharвведите 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;

Если вам нужно использовать путь вCodeВ разделе (вне скрипта Pascal) вы можете использовать скриптовую константу:

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

И вам нужно изменить сигнатуру функции, чтобы она принимала фиктивный параметр:

function GetAppDataLocalLow(Param: string): string;

Например, чтобы удалить файл при удалении из LocalLow с помощью INNO:

[UninstallDelete]
Type: filesandordirs; Name: "{userappdata}\..\LocalLow\MyFile.txt"
Другие вопросы по тегам