[Delphi] FindResource nie znajduje zasobu

Odpowiedz Nowy wątek
2006-11-30 23:06
Krzychu0000
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?

Pozostało 580 znaków

2006-11-30 23:35
0

a ten zasób się nazywa TZASOB :>


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-30 23:44
Krzychu0000
0

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

Pozostało 580 znaków

2006-12-01 00:11
0

to może otwieraj je po indeksie nie po nazwie


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-12-01 03:41
dj
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


Great spirits have always encountered violent opposition from mediocre minds.

Pozostało 580 znaków

2006-12-01 20:22
Krzychu0000
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ć?

Pozostało 580 znaków

2006-12-01 21:45
Krzychu0000
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?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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