Пользовательский URL-адрес Inno Setup для Chrome

Я использую Eclipse и Inno Setup для создания небольшого приложения. Компиляция производится с помощью Ant. Все работает нормально, я мог найти, где сгенерирован файл .iss по умолчанию, поместить его в свой пакет Eclipse и изменить его, чтобы мой установщик вводил ключи реестра, чтобы Windows поддерживала настраиваемый URL-адрес моего приложения.

(project/build/package/windows/myapp.iss, добавлена ​​[Registry] часть)

Он работает в IE и Edge, но, к сожалению, не в Chrome, поскольку Google решил не следить за реестром, когда дело доходит до настраиваемых URL-адресов ...

Кто-нибудь из вас знает, можно ли установить пользовательский URL-адрес для Chrome с помощью установщика Inno Setup?

На данный момент я знаю, что нам нужно изменить %localappdata%/Google/Chrome/User Data/Local State, чтобы добавить протокол, но возможно ли это через Inno Setup?


person Psychokiller1888    schedule 01.11.2015    source источник


Ответы (1)


Local State файл конфигурации Chrome находится в формате JSON.

Inno Setup не поддерживает JSON самостоятельно. Вы можете попробовать взломать файл вручную, используя простую манипуляцию со строкой.

Но я бы порекомендовал вам использовать стороннюю библиотеку для анализа JSON, например Библиотека конфигурации TLama Inno JSON.


Код может быть таким, как показано ниже.

Код добавляет / устанавливает этот ключ в JSON. Я надеюсь, что это то, что вам нужно.

"protocol_handler": { 
  "excluded_schemes": { 
     "myprotocol": true
  }
}
[Files]
Source: "JSONConfig.dll"; Flags: dontcopy

[code]
function JSONQueryBoolean(FileName, Section, Key: WideString; 
  Default: Boolean; var Value: Boolean): Boolean;
  external 'JSONQueryBoolean@files:jsonconfig.dll stdcall';
function JSONWriteBoolean(FileName, Section, Key: WideString;
  Value: Boolean): Boolean;
  external 'JSONWriteBoolean@files:jsonconfig.dll stdcall';

procedure EnableChromeProtocol(Protocol: string);
var
  FileName: WideString;
  BoolValue: Boolean;
begin
  FileName := ExpandConstant('{localappdata}') + '\Google\Chrome\User Data\Local State';
  Log('Chrome local state config file: ' + FileName);

  if JSONQueryBoolean(
       FileName, 'protocol_handler.excluded_schemes', Protocol, False, BoolValue) then
  begin
    if BoolValue then
    begin
      Log('Protocol is enabled');
    end
      else
    begin
      Log('Protocol is disabled');
    end;
  end
    else
  begin
    Log('Protocol not configured');
    BoolValue := False;
  end;

  if not BoolValue then
  begin
    if JSONWriteBoolean(FileName, 'protocol_handler.excluded_schemes', Protocol, True) then
    begin
      Log('Protocol enabled');
    end
      else
    begin
      Log('Protocol enabling failed');
    end;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
    EnableChromeProtocol('myprotocol');
  end;
end;

Для кода требуется Unicode-версия Inno Setup.


См. Также Установка Inno: Работа с JSON.


Также существует альтернативная реализация - JsonParser.

person Martin Prikryl    schedule 01.11.2015
comment
Вау, это именно то, что я искал, и хотя я не могу сейчас проверить, я уже могу сказать, что это то, что мне было нужно ... Проверю сегодня вечером, когда я вернусь домой, и я вернусь, если понадобится. Спасибо большое! - person Psychokiller1888; 01.11.2015
comment
Хорошо, все работает, просто нужно быть абсолютно уверенным, что Chrome закрыт, а также его новая фоновая служба, иначе эта процедура установки будет перезаписана. Нет, для включения протокола необходимо установить значение false. Но по некоторым причинам он все равно не будет работать с моим url, но это уже другой вопрос. Спасибо за помощь и скрипт! - person Psychokiller1888; 01.11.2015