[Delphi] FindResource nie znajduje zasobu

0

Dzisiaj zabrałem się za zasoby. No i tak siedzę od 3 godzin, wertuje forum, FAQ, arty, google, helpa. Wszędzie jest o zasysaniu zasobów które mamy we własnej aplikacji (hinstance). Nie mogę sobie poradzić z załadowaniem zasobu jakiegoś innego execa. Robie tak:

var
 H, H2: THandle;

Begin
H := BeginUpdateResource('JakisProgram.exe', False);
H2 := FindResource(H, 'TZASOB', RT_RCDATA);
...

H znajduje, ale w H2 już nic nie mam, a przecież powinienem mieć prawda? PeExplorer i ResHack widzą ten zasób. Na forum znalazłem aby zamiast RT_RCDATA dać 'DATA' - też nie pomogło. W Demosach coś znalazłem ale nie podoba mi się ten sposób, na jakiś typach RxTypes, chce to zrobić na czystym WinAPI. Może ktoś mi podać wskazówke?

0

a ten zasób się nazywa TZASOB :>

0

No oczywiście że nie, tak tylko dla przykładu podałem :P

0

to może otwieraj je po indeksie nie po nazwie

0

Jeżeli nie pomogło to co napisał Misiekd to sprawdz co jest w tym exe'cu jakąś funkcja z rodziny EnumResource... jeżeli to nie przyniesie efektów to zrezygnuj z BeginUpdateResource jaku żródło uchwytu do exe'ca(też miałem z powodu tej funkcji problemy) LoadLibrary powinno dać jakiś efekt. Inne programy do edycji zasobów widzą je poniewarz nie korzystają z funkcji WinAPI, tylko same przeglądają plik.

Mam nadzieje że moje podopwiedzi dadzą jakis pozytywny efekt.

Pozdrawiam Dj

0

Dzięki wam [browar] . Faktycznie coś nie tak było z BeginUpdateResource, zamieniłem na LoadLibrary i hula tak jak powinno, pomieszałem WinAPI z strumieniami, kod teraz wygląda tak, może komuś się przyda:

procedure TForm1.Button1Click(Sender: TObject);
 var
 H: THandle;
 MM: TMemoryStream;
 Res: TResourceStream;
begin
  MM := TMemoryStream.Create;
  Try
    H := LoadLibrary('Program1.exe');
    Res := TResourceStream.Create(H, 'TBUTTON', RT_RCDATA);
    ObjectBinaryToText(Res, MM);
    MM.Seek(0, 0);
    Memo1.Lines.LoadFromStream(MM);
  Finally
    MM.Free;
    Res.Free;
  end;
end;

Jak widać zamieniam sobie dane binarne na opisujący ten obiekt text, bo muszę zmienić w nim property i ponownie podmienić w execu. Zaraz spróbuje z UpdateResource, mam nadzieje że jak coś to mogę na was liczyć ;)

BTW: Można ten kod jakoś zamienić tak aby całkowicie korzystał z WinAPI? Ucze się ostatnio korzystać najwięcej z modułu Windows no i jestem ciekaw czy można jakoś zamienić TResourceStream i ObjectBinaryToText na coś innego?

BTW2: Już 4 wysyłam przypomnienie o hasło do forum ale nic na mojego maila nie przychodzi. Czy po zmianach na forum które miały miejsce jakiś czas temu musze na nowo konto założyć?

0

No i klops :-[ . Po zamienieniu na text, dla przykładu w memo zmieniam sobie Height i chce ponownie zamienić text na binary ale wywala mi że "OBJECT expected on line 1". A przecież to ten sam text, ma tylko inną wartość height. WTF?
Kod:

  MM := TMemoryStream.Create;
  SS := TStringStream.Create('');
  Try
    H := LoadLibrary('Program1.exe');
    Res := TResourceStream.Create(H, 'TBUTTON', RT_RCDATA);
    ObjectBinaryToText(Res, MM);
    MM.Seek(0, 0);
    Memo1.Lines.LoadFromStream(MM);
    Memo1.Text := StringReplace(Memo1.Text, 'Height = 15', 'ClientHeight = 30', [rfReplaceAll]);
    Memo1.Lines.SaveToStream(MM);
    ObjectTextToBinary(MM, Res);
    ...

Co robie nie tak?

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