Изменение строки в ресурсе exe

Как мне изменитьbuffer в следующем коде затем сохранить изменения в ресурсе исполняемого файла? Я'ищу что то подобное.SetString(handle,index,buffer,size)

var
  hExe : Cardinal;
  buffer : array [0..4097] of ansichar;
begin
  hExe:=LoadLibraryEx(PAnsiChar(Edit2.Text),0,LOAD_LIBRARY_AS_DATAFILE);
  LoadString(hExe,65300,buffer,SizeOf(buffer));
  ShowMessage(buffer);
  //need to modify buffer here then I'll unload the resources..
end;

Обновить: Вот'моя попытка на UpdateResource

var
  hEXE: DWORD;
  pData: PAnsiChar;
begin
  pData := PAnsiChar(Edit1.Text);
  hEXE := BeginUpdateResource(pchar(edit2.text), FALSE);
  if hEXE  0 then
  begin
    UpdateResource(hEXE, RT_string, MAKEINTRESOURCE(4082), LANG_NEUTRAL,
      @pData, Length(pData)); //if i change 4082 to 65300 it creates another key like 4082
    EndUpdateResource(hEXE, FALSE);
  end;

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

STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
65296,  "Unicode"
65297,  "Big Endian Unicode"
65298,  "UTF-8"
65299,  "UTF-7"
65300,  "ABCDE12345"
}

Поэтому мне либо нужно проанализировать группу строк, либо мне нужен API для установки строки модификации с индексом 65300 в группе. Есть идеи? Я

Ответы на вопрос(4)

Там'S статья поговорить об этом наDelphi3000:

Ресурсы внутри .exe файлов

 Ertugrul Kara30 сент. 2009 г., 18:08
Спасибо, но это не такпоказать, как изменить содержимое RT_STRING.

Я считаю, что вам нужно заменить всю группу версией, содержащей ваши модификации. Это н'Это трудно разобрать, и вы можете сделать несколько ярлыков. Загрузите все в tStringlist, а затем зацикливайте список до тех пор, пока строка не начнется с '65300», Выполните замену и сохраните текстовую часть списка строк в качестве ресурса замены.

Вы можете увидетьисходный код (Delphi 2006) изРедактор ресурсов XN (это бесплатный, мощный, полнофункциональный редактор ресурсов и PE-модуль для Windows 98, Windows 2000 и Windows XP).

кроме того, вы должны проверить следующие функции

BeginUpdateResourceUpdateResourceEndUpdateResource

До свидания.

 Ertugrul Kara30 сент. 2009 г., 17:44
Правда, но код зависит от требований (пакет под названием resourceutils от того же человека). Я незначит бытьgive me the codes so I can copy-paste and use them, но это'Отчасти излишне анализировать большой пакет для простого использования.
 Ertugrul Kara30 сент. 2009 г., 17:29
Требования XN Resource Editor отсутствуютt скомпилировать с D2009 (левая сторона не может определить ошибку - pngimage.pas ln 1845). Я'Я пытался с UpdateResource, но я продолжал портить другие строки в той же категории.
 RRUZ30 сент. 2009 г., 17:39
Google твой другgoogle.com/...
 RRUZ30 сент. 2009 г., 17:35
вам не нужно компилировать ваш проект, вы можете анализировать код напрямую.
Решение Вопроса

мы нашлиответ используя гугл. (Английский перевод с китайского) В любом случае спасибо всем!

procedure UpdateResString(AFileName, ANewString: string; AStringIdent: Integer);
  procedure WriteToArray(AArray: TByteDynArray; AData: Word; var APos: Integer);
  begin
    AArray[APos] := Lo(AData);
    AArray[APos + 1] := Hi(AData);
    Inc(APos, 2);
  end;

  function ReadFromArray(AArray: TByteDynArray; APos: Integer): Word;
  begin
    Result := AArray[APos] + AArray[APos + 1] * 16;
  end;

var
  hModule, hResInfo, hUpdate: THandle;
  ResData, TempData: TByteDynArray;
  wsNewString: WideString;
  iSection, iIndexInSection: Integer;
  i, iLen, iSkip, iPos: Integer;
begin
  hModule := LoadLibrary(PChar(AFileName));
  if hModule = 0 then
    raise Exception.CreateFmt('file %s failed to load.', [AFileName]);

  // Calculate the resource string area and the string index in that area
  iSection := AStringIdent div 16 + 1;
  iIndexInSection := AStringIdent mod 16;

  // If the resource already exists, then read it out of the original data
  hResInfo := FindResource(hModule, MakeIntResource(iSection), RT_STRING);
  if hResInfo  0 then
  begin
    iLen := SizeOfResource(hModule, hResInfo);
    SetLength(ResData, iLen);
    CopyMemory(ResData, LockResource(LoadResource(hModule, hResInfo)), iLen);
  end;
  // Should first close the file, and then update
  FreeLibrary(hModule);
  // Calculate the new data is written to location
  wsNewString := WideString(ANewString);
  iLen := Length(wsNewString);
  iPos := 0;
  for i := 0 to iIndexInSection do
  begin
    if iPos > High(ResData) then
      SetLength(ResData, iPos + 2);
    if i  iIndexInSection then
    begin
      iSkip := (ReadFromArray(ResData, iPos) + 1) * 2;
      Inc(iPos, iSkip);
    end;
  end;

  // Delete the original data and the data behind the temporary
  // storage of data to be added
  iSkip := (ReadFromArray(ResData, iPos) + 1) * 2;
  TempData := Copy(ResData, iPos + iSkip, Length(ResData) - iSkip);
  SetLength(ResData, iPos);
  SetLength(ResData, iPos + (iLen + 1) * 2 + Length(TempData));

  // Write new data
  WriteToArray(ResData, iLen, iPos);
  for i := 1 to iLen do
    WriteToArray(ResData, Ord(wsNewString[i]), iPos);
  // Write back to the original data
  for i := 0 to High(TempData) do
    ResData[iPos + i] := TempData[i];

  // Write the data back to file
  hUpdate := BeginUpdateResource(PChar(AFileName), False);
  if hUpdate = 0 then
    raise Exception.CreateFmt(
      'cannot write file %s. Please check whether it is open or set read-only.',
      [AFileName]);

  UpdateResource(hUpdate, RT_STRING, MakeIntResource(iSection), LANG_NEUTRAL,
    ResData, Length(ResData));
  EndUpdateResource(hUpdate, False);
end;
 Michael Myers05 июн. 2013 г., 17:39
Пользователь, у которого слишком мало репутации, чтобы комментировать, ответил, чтоResult := AArray[APos] + AArray[APos + 1] * 16; должно бытьResult := AArray[APos] + AArray[APos + 1] * 16;, Я понятия не имею, правильно это или нет; просто выкладываю это там, чтобы вы увидели.

Ваш ответ на вопрос