Zapis stringa do zasobów exe

0

W moim gotowym pliku exe mam pustą tablicę stringów:

STRINGTABLE
BEGIN
   1, "cos1"
   2, "cos2"
END

Przez drugi program chcę zaaktualizaować pierwszą wartość z cos1 na mojawartosc:

procedure TForm1.Button1Click(Sender: TObject);
var
  hEXE: DWORD;
  pData: PAnsiChar;
begin
  pData := PAnsiChar('mojawartość');
  hEXE := BeginUpdateResource(pchar('D:\plik.exe'), FALSE);
  if hEXE <> 0 then
  begin
    UpdateResource(hEXE, RT_STRING, '1', LANG_NEUTRAL, @pData, Length(pData)); 
    EndUpdateResource(hEXE, FALSE);
  end;
end;

Jednak nie działa... W czym tkwi błąd?

1

co zwraca UpdateResource i EndUpdateResource

0

**UpdateResource **zwraca:

user image

0
UpdateResource(hEXE, RT_STRING, '1', LANG_NEUTRAL, @pData, Length(pData));

Dajesz wskaźnik na pData, a pData samo w sobie jest wskaźnikiem. Usuń @.

0

Usunąłem i nadal ten sam błąd.

0

LOL prostytutka następny wspaniały, co jak napisze NIE DZIAŁA to myśli, że napisał wystarczająco a tu się nagle okazuje że AV wyskakuje...
Zobacz tak

procedure TForm1.Button1Click(Sender: TObject);
var
  hEXE: DWORD;
  dupa: string;
begin
  dupa := 'mojawartość';
  hEXE := BeginUpdateResource(pchar('D:\plik.exe'), FALSE);
  if hEXE <> 0 then
  begin
    UpdateResource(hEXE, RT_STRING, '1', LANG_NEUTRAL, @dupa[1], Length(pData)); 
    EndUpdateResource(hEXE, FALSE);
  end;
end;
0

Zrobiłem tak jak mówisz i nadal ten sam błąd jak chcę aktualizować (przy UpdateResource).

Do tego tworzy mi się nowy zasób "1", jak go chcę podejrzeć to:

user image

0

z jakim IDLang masz zapisane a z jakim próbujesz???

0

Ten sam błąd DALEJ....
wychodze z siebie już. Przeszukałem pół Internetu z tym UpdateResource - na ruskich, chińskich stronach i dalej tego nie mogę zrobić.

0

Odświeżam temat. Nikt nie ma pomysłu? Bardzo mi na tym zalezy.

0

Wystarczyło pogoogle'ować

type
  TByteDynArray = array of Byte;

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]);

  iSection := AStringIdent div 16 + 1;
  iIndexInSection := AStringIdent mod 16;

  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;

  FreeLibrary(hModule);

  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;

  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));

  WriteToArray(ResData, iLen, iPos);
  for i := 1 to iLen do
    WriteToArray(ResData, Ord(wsNewString[i]), iPos);

  for i := 0 to High(TempData) do
    ResData[iPos + i] := TempData[i];

  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;

@Edit: BTW program zmieniający stringa w Windows Vista/7 musi być uruchomiony jako administrator (przynajmniej ja to zauważyłem)

0

Wielkie dzięki! ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1