Вопрос Как сделать так, чтоб путь к exe, записывался в файл config как в реестре.

Devils Night

Ветеран
Ситуация такая, что, нужно чтоб путь к exe, записывался в файл config как в реестре.
В общем есть файл конфиг, в котором есть значение ExePath=
Нужно чтоб при установке, к ExePath= прописывался путь вида как у экспортированного reg файла "\"C:\\Program Files\\My Program\\MyProg.exe\""

Примерный результат
Код:
ExePath="\"C:\\Program Files\\My Program\\MyProg.exe\""
Похожее >>
Код:
[ Code]
procedure TestConfig();
var
  str: string;
  ConfigFile: string;
  ResultCode: Integer;
begin
  ConfigFile:= ExpandConstant('{src}\Setup.config');
  str:= str+ 'UninstallString' + '=' + ExpandConstant('{app}');
  SaveStringToFile(ConfigFile, str, False);
  Exec(ConfigFile, '', '', SW_HIDE, ewNoWait, ResultCode);
end;

procedure DeinitializeSetup();
begin
  TestConfig();
end;
но не то.

Как сделать?
 

sergey3695

Ветеран
Модератор
Devils Night,
а ты уверен, что
Код:
ExePath="\"C:\\Program Files\\My Program\\MyProg.exe\""
столько скобок? хм...смысл в них. кинька этот reg.
 

Devils Night

Ветеран
Абсолютно. Я не сомневался что вгоню в ступор своим вопросом, так же озадачен как сделать тоже самое в Setup.config, только нужно чтоб аналогичным способом, прописывались значения в Setup.config от переменных типа {app}, {pf}, {group} и.т.д.

В самом реестре выглядит так
Код:
"C:\Program Files\My Program\MyProg.exe"
после экспортирования, выглядит так
"\"C:\\Program Files\\My Program\\MyProg.exe\""
это как раз не удивляет, а как сделать так чтоб эта хренотень прописалась в конфиг, ума не приложу.


кинька этот reg.
ниже файлы.
 

Вложения

nik1967

Old Men
Проверенный
Shegorat ещё давал пример
Двойной слеш для записи в ини-файл
Код:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[INI]
Filename: "C:\MyProg.ini"; Section: "InstallSettings"; Key: "InstallPath"; String: "{code:DoubleSlash|{app}}"; Flags: uninsdeletesection

[code]

function DoubleSlash(S: String): String;
var i: Integer;
begin
Result:='';
  while Length(S)>0 do begin
    i:=Pos('\', S);
    if i>0 then begin
      Result:= Result+Copy(S, 1, i-1)+'\\';
      Delete(S, 1, i);
    end else begin
      Result:= Result+S;
      SetLength(S, 0);
    end;;
  end;
end;
 

Snoopak96

Старожил
nik1967,
вроде как не ini и секции InstallSettings нету, поиск и замена нужно скорее всего.
 

ReFLeXx

Новичок
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: Setup.config; DestDir: {app}; Flags: ignoreversion;

[ Code]

function DoubleSlashes(Str: String): String;
var
  Len: Cardinal;
  i: Cardinal;
begin
  Len:=Length(Str);
  i:=1;
  while (i <= Len) do begin
    if (Str[i] = '\') then begin
      Insert('\', Str, i);
      Len:=Len+1;
      i:=i+1;
    end;
    i:=i+1;
  end;
  Result:=Str;
end;

function AddQuotes(Str: String): String;
begin
  Result:='"\"'+Str+'\""';
end;

function WriteInFile(FileName, SectionName, Value: String): Boolean;
var
  FileValue: AnsiString;
  Position: Integer;
begin
  Result:=LoadStringFromFile(FileName, FileValue);
  if Result then begin
    Position:=Pos(SectionName+'=', FileValue);
    if (Position <> 0) then
     Insert(Value, FileValue, Position+Length(SectionName)+1);
    Result:=SaveStringToFile(FileName, FileValue, False);
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep = ssPostInstall) then
   WriteInFile(ExpandConstant('{app}\Setup.Config'), 'ExePath', AddQuotes(DoubleSlashes(ExpandConstant('{app}\MyExe.exe'))));
end;
В большей части функций не защиты от дураков...
 

Вложения

sergey3695

Ветеран
Модератор
Devils Night,
Код:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: Setup.config; DestDir: {app}; Flags: ignoreversion

[code]
function DoubleSlash(S: String): String;
var i: Integer;
begin
Result:='';
  while Length(S)>0 do begin
    i:=Pos('\', S);
    if i>0 then begin
      Result:= Result+Copy(S, 1, i-1)+'\\';
      Delete(S, 1, i);
    end else begin
      Result:= Result+S;
      SetLength(S, 0);
    end;;
  end;
end;

procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
  S: TArrayOfString;
  i : Integer;
begin
  if not FileExists(FilePath) then begin MsgBox('Файл не найден', mbError, mb_Ok); Exit;end; // если файла нет, выходим
  LoadStringsFromFile(FilePath, S); // загружаем файл
  for i:= 0 to GetArrayLength(S)-1 do begin
    if (Pos(AnsiUpperCase(find), AnsiUpperCase(S[i])) > 0) then begin
      StringChangeEx(S[i], find, replace, True);
    end;
  end;
  SaveStringsToFile(FilePath, S, False); // сохраняем файл
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
  RePlaceTextinFile(ExpandConstant('{app}\Setup.config'),'ExePath=','ExePath="\"'+DoubleSlash(ExpandConstant('{app}'))+'\""');
end;
;) в Setup.config должно быть прописано ExePath=
ReFLeXx, не видел :D
 
Последнее редактирование:

Devils Night

Ветеран
поиск и замена нужно скорее всего.
Почти. Моя ошибка, не уточнил, уточняю =>
Народ, насчет 'ExePath' или 'ExePath=', уловили очень точно. Самого файла конфиг может не быть, но 'ExePath=' как бы так сказать, должна играет роль жёсткой переменной или как там ее еще назвать.
Короче говоря, конфиг может как присутствовать, так и отсутсвовать, если конфиг присутствует рядом с инсталлятором, то этот конфиг при установке, должен подхватываться и копироваться в папку установки, а дальше, из DefaultDirName в ExePath= происходило прописывание пути. Насчет файла конфига, есть один нюанс, в файле конфиг, могут содержаться комментарии а ниже ExePath=
Код:
;Комментарий
;Еще комментарий

ExePath=
ExePath= не должен быть перемещаем по конфигу, выше ниже и.т.д. но должен прописываться путь из DefaultDirName в ExePath=.
Если конфига нет, то насчет комментариев все равно, только добавление ExePath= и прописывание пути.
Или все эти действия приблизительно.

Вот такой геморрой, повис надомной.
 

ReFLeXx

Новичок
Если я правильно понял, то если файл присутствует рядом с инсталлятором, то он должен копироваться в папку, а если его нет, то распаковывается свой.
Код:
#define SetupConfig "Setup.Config"

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: {#SetupConfig}; DestDir: {app}; Flags: ignoreversion; Check: not CheckConfigFile;
Source: {src}\{#SetupConfig}; DestDir: {app}; Flags: external; Check: CheckConfigFile;

[ Code]

function CheckConfigFile(): Boolean;
begin
  Result:=FileExists(ExpandConstant('{src}\{#SetupConfig}'));
end;

function DoubleSlashes(Str: String): String;
var
  Len: Cardinal;
  i: Cardinal;
begin
  Len:=Length(Str);
  i:=1;
  while (i <= Len) do begin
    if (Str[i] = '\') then begin
      Insert('\', Str, i);
      Len:=Len+1;
      i:=i+1;
    end;
    i:=i+1;
  end;
  Result:=Str;
end;

function AddQuotes(Str: String): String;
begin
  Result:='"\"'+Str+'\""';
end;

function WriteInFile(FileName, SectionName, Value: String): Boolean;
var
  FileValue: AnsiString;
  Position: Integer;
begin
  Result:=LoadStringFromFile(FileName, FileValue);
  if Result then begin
    Position:=Pos(SectionName+'=', FileValue);
    if (Position <> 0) then
     Insert(Value, FileValue, Position+Length(SectionName)+1);
    Result:=SaveStringToFile(FileName, FileValue, False);
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep = ssPostInstall) then
   WriteInFile(ExpandConstant('{app}\{#SetupConfig}'), 'ExePath', AddQuotes(DoubleSlashes(ExpandConstant('{app}\MyExe.exe'))));
end;
 

Вложения

Snoopak96

Старожил
Devils Night,
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[_Code]
function DoubleSlashes(Str: String): String;
var
  Len: Cardinal;
  i: Cardinal;
begin
  Len:=Length(Str);
  i:=1;
  while (i <= Len) do begin
  if (Str[i] = '\') then begin
  Insert('\', Str, i);
  Len:=Len+1;
  i:=i+1;
  end;
  i:=i+1;
  end;
  Result:=Str;
end;

function AddQuotes(Str: String): String;
begin
  Result:='"\"'+Str+'\""';
end;

procedure SearchReplace(file,text,exe:string);
var
  ss: TArrayOfString;
  s: String;
  i: Integer;
begin
  LoadStringsFromFile(file, ss);
  s:= '';
  for i:=0 to GetArrayLength(ss)-1 do begin  //Ищем номер строки
  if Pos(text, ss[i])>0 then begin
  s:= ss[i];
  Delete(s,Pos('=',s)+1,Length(s));  //Выпиливаем из найденого всё после равно до конца строки
  ss[i]:=s + +AddQuotes(DoubleSlashes(exe));  //Пишем своё
  SaveStringsToFile(file, ss, False);  //Сохроняем
  end;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if(CurStep = ssPostInstall)then
  if FileExists(ExpandConstant('{src}\Setup.Config')) then begin FileCopy(ExpandConstant('{src}\Setup.Config'), ExpandConstant('{app}\Setup.Config'), true);
  SearchReplace(ExpandConstant('{app}\Setup.Config'),'ExePath=',ExpandConstant('{app}\MyExe.exe'));
  end else SaveStringToFile(ExpandConstant('{app}\Setup.Config'), 'ExePath='+AddQuotes(DoubleSlashes(ExpandConstant('{app}\MyExe.exe'))), False);
end;
 

nik1967

Old Men
Проверенный
Snoopak96, спасибо за procedure SearchReplace - в немного переделанном виде подошла для моих целей :)
 

Devils Night

Ветеран
Всё отрабатывает, только появилась проблема. Как добавить пустоту, т.е пробел между знаком равно?
т.е не так
ExePath="\"C:\\Program Files\\My Program\\MyExe.exe\""
а так
ExePath = "\"C:\\Program Files\\My Program\\MyExe.exe\""
?
Знаю что перенос строки делается так #13, а как пробел сделать чето никак не соображу.
 
Сверху