Вопрос Рандомные ключи для игры в реестр

tihiy_don

Старожил
Доброго времени суток, Уважаемые участники форума krinkels.org! Возникла необходимости рандомно прописывать ключи в строку реестра для сетевой игры из набора ключей текстового файла или массива (как лучше я хз). При одинаковых ключах возникала проблема у нескольких игроков. Может кто-то подсказать по этому поводу?

Строка реестра выглядит следующим образом:
code_language.pascal:
Root: HKLM; SubKey: "Software\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc"; ValueType: string; ValueName: ; ValueData: "PB4CC5AFS3BUQSZMKSDD"
Также, возможно кто-то сталкивался с такой необходимостью, как прописывание формата разрешения текущего монитора у пользователя в определённую строчку файла с форматом расширением .ini? Файл прикрепил во вложении.
 

Вложения

Nemko

Дилетант
Модератор
Возникла необходимости рандомно прописывать ключи в строку реестра
В секцию [Registry] можно добавить таким методом,но не знаю в чем смысл, если декомпиляцией можно получить все ключи, а если в файле хранить чем шифровать вопрос...
З.Ы.: Чтобы ключи не совпадали нужно от чего-то оттолкнутся, например если файл с ключами будет хранится в сети, вообщем нужно думать...
Также, возможно кто-то сталкивался с такой необходимостью, как прописывание формата разрешения текущего монитора у пользователя в определённую строчку файла с форматом расширением .ini?
Может кто-то подсказать по этому поводу?
Если конкретно излагать суть вопроса и прилагать усилие, может кто и откликнется советом. ;)
 
Последнее редактирование:

tihiy_don

Старожил
В секцию [Registry] можно добавить таким методом,но не знаю в чем смысл, если декомпиляцией можно получить все ключи, а если в файле хранить чем шифровать вопрос...
З.Ы.: Чтобы ключи не совпадали нужно от чего-то оттолкнутся, например если файл с ключами будет хранится в сети, вообщем нужно думать...
Ну у меня список примерно из 20 ключей, получается у вас в примере 2 ключа, а мне просто добавить список из эти 20 такими методом и они будут рандомно у каждого прописываться?

А по поводу ини файла, там на строке необходимо вот так прописывать: Resolution = 1280 720. Ширина и высота через пробел. Пока не могу разобрать как использовать функции :( Разрешение экрана при помощи вашего примера я смог получить))
 
Последнее редактирование:

tihiy_don

Старожил
Попробовал убрать строку:
Randomize;

Вроде все работает, ключи ставятся в реестр рандомно.
 

Nemko

Дилетант
Модератор
прописывание формата разрешения текущего монитора у пользователя в определённую строчку файла
tihiy_don, можно как-то так (судя по INI файлу):
Код:
[Setup]
AppName=Exp
AppVersion=0.1
CreateAppDir=no

[*Code]
type
  HDC = LongWord;

function GetDC(HWND: hWnd): HDC; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(HDC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: hWnd; DC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';

function GetMonitorInfo: TPoint;
var
  DC: HDC;
  Screen, null: TPoint;
begin
  Result:=null;
  DC:=GetDC(MainForm.Handle);
  Screen.x:=GetDeviceCaps(DC, 08);
  Screen.y:=GetDeviceCaps(DC, 10);
  if (Screen.x <> 0) and (Screen.y <> 0) then Result:=Screen;
  ReleaseDC(MainForm.Handle, DC);
end;

function SetResolutionInINI(FileName: PAnsiChar): Boolean;
var
  s: AnsiString;
  Screen: TPoint;
  i, b, e: Integer;
  ErrCheck: Boolean;
begin
  Result:=False;
  if not LoadStringFromFile(FileName, s) then Exit;
  if Pos('Resolution', s) <> 0 then begin
    for i:=Pos('Resolution', s) + Length('Resolution') to Length(s)-1 do begin
      if (s[i] = '=') and ErrCheck then Exit;
      if (s[i] = '=') and not ErrCheck then begin
        ErrCheck:=True;
        b:=i;
      end;
      if s[i] = #13 then begin
        e:=i;
        Break;
      end;
    end;
    Screen:=GetMonitorInfo;
    Result:=SaveStringToFile(FileName, Copy(s, 0, b)+' '+IntToStr(Screen.x)+' '+IntToStr(Screen.y)+Copy(s, e, Length(s)-e-1), False);
  end;
end;

procedure InitializeWizard;
begin
  SetResolutionInINI(ExpandConstant('{src}\Options.ini'));
end;
 
Последнее редактирование:

tihiy_don

Старожил
tihiy_don, можно как-то так (судя по INI файлу):
Код:
[Setup]
AppName=Exp
AppVersion=0.1
CreateAppDir=no

[*Code]
type
HDC = LongWord;

function GetDC(HWND: hWnd): HDC; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(HDC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: hWnd; DC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';

function GetMonitorInfo: TPoint;
var
  DC: HDC;
  Screen, null: TPoint;
begin
  Result:=null;
  DC:=GetDC(MainForm.Handle);
  Screen.x:=GetDeviceCaps(DC, 08);
  Screen.y:=GetDeviceCaps(DC, 10);
  if (Screen.x <> 0) and (Screen.x <> 0) then Result:=Screen;
  ReleaseDC(MainForm.Handle, DC);
end;

function SetResolutionInINI(FileName: PAnsiChar): Boolean;
var
  s: AnsiString;
  Screen: TPoint;
  i, b, e: Integer;
  ErrCheck: Boolean;
begin
  Result:=False;
  if not LoadStringFromFile(FileName, s) then Exit;
  if Pos('Resolution', s) <> 0 then begin
    for i:=Pos('Resolution', s) + Length('Resolution') to Length(s)-1 do begin
      if (s[i] = '=') and ErrCheck then Exit;
      if (s[i] = '=') and not ErrCheck then begin
        ErrCheck:=True;
        b:=i;
      end;
      if s[i] = #13 then begin
        e:=i;
        Break;
      end;
    end;
    Screen:=GetMonitorInfo;
    Result:=SaveStringToFile(FileName, Copy(s, 0, b)+' '+IntToStr(Screen.x)+' '+IntToStr(Screen.y)+Copy(s, e, Length(s)-e-1), False);
  end;
end;

procedure InitializeWizard;
begin
  SetResolutionInINI(ExpandConstant('{src}\Options.ini'));
end;
Работает. Спасибо большое.
А вот смотрите, у меня получается этот файлы создаётся при установке и помещается в аппдату:
Код:
Source: "D:\инсталл властелин колец\Options.ini"; DestDir: "{userappdata}\Властелин Колец, Под знаменем Короля-чародея - Мои файлы"
Каким образом я могу поступить, чтобы уже созданный инсталлом файл перезаписался после установки?
То-есть, если я так допишу то это не прокатит?
Код:
SetResolutionInINI(ExpandConstant('{userappdata}\Властелин Колец, Под знаменем Короля-чародея - Мои файлы\Options.ini'));
 

Nemko

Дилетант
Модератор
tihiy_don, используйте процедуру CurStepChanged, и на этапе после установки (ssPostInstall) или завершения установки (ssDone) вызывайте функцию:
Код:
procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssDone: SetResolutionInINI(ExpandConstant('{userappdata}\...\Options.ini'));
  end;
end;
 

tihiy_don

Старожил
tihiy_don, используйте процедуру CurStepChanged, и на этапе после установки (ssPostInstall) или завершения установки (ssDone) вызывайте функцию:
Код:
procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssDone: SetResolutionInINI(ExpandConstant('{userappdata}\...\Options.ini'));
  end;
end;
Большое Вам спасибо, всё заработало. Встроил в свой код :) Теперь наши игроки наконец могут наслаждаться комфортной игрой с модом без 100500 пунктов установки:)
 

tihiy_don

Старожил
Здравствуйте. Кто-нибудь может подсказать, я пытаюсь перевести путь установки в нижний регистр. Почитал в справке есть такая функция:

Код:
function AnsiLowercase(S: String): String;
begin
  Result:= AnsiLowercase('{app}');
end;
Далее я записываю реестр так:

Код:
Root: HKLM; Subkey: "Software\THQ\Dawn Of War - Dark Crusade"; ValueType: string; ValueName: "installlocation"; ValueData: "{code:AnsiLowercase}\DowOnlineRaceUnlocker\"
Но при создании записей реестра инсталлятор зависает.
 

Shegorat

Lord of Madness
Администратор
@tihiy_don, бесконечная рекурсия и переполнение стека.
AnsiLowercase вызывает сама себя
Код:
Root: HKLM; Subkey: "Software\THQ\Dawn Of War - Dark Crusade"; ValueType: string; ValueName: "installlocation"; ValueData: "{code:LowerPath}\DowOnlineRaceUnlocker\"


function LowerPath(S: String): String;
begin
  Result:= AnsiLowercase('{app}');
end;
 
Сверху