Zasobów ciąg dalszy

0

Mam kolejny problem z zasobami pliku exe. Tym razem chodzi o zamianę głównej ikony execa. Próbowałem w taki sposób:

var
ic:hicon;
uchwyt:thandle;

uchwyt:=BeginUpdateResource('ścieżka', false);
ic:=LoadIcon(0, PChar('ścieżka'));
UpdateResource(uchwyt, RT_GROUP_ICON, 'MAINICON', 1045, @ic, sizeof(ic));
EndUpdateResource(uchwyt, false);

I niestety nie działa to. Kasuje poprzednią ikonę, więc nie jest to wina nie znalezienia odpowiedniego zasobu, lecz raczej niepoprawnego załadowania danych (próbowałem także ładować przez tmemorystream). Szukałem tego już chyba wszędzie... Jakieś pomysły? :)

0

Tak więc w Twoim kodzie jest kilka błędów:
1)[code]LoadIcon(0, PChar('ścieżka'));[/code]Jako pierwszy parametr wpisujesz zero, a w pliku pomocy ("Po pierwsze F1" jak ktoś kiedyś pisał) wyraźnie stoi:

(pierwszy parametr) Identifies an instance of the module whose executable file contains the icon to be loaded. This parameter must be NULL when a standard icon is being loaded.

Więc jeśli podajesz ścieżkę (to błąd nr 2), to raczej nie chodzi Ci o ikonę standardową.
Powinieneś jako pierwszy parametr podać "instance" (ciekaw jestem jaki jest polski odpowiednik tego słowa - "instancja"?) do Twojego exe'ka, a jako drugi parametr - to już w punkcie drugim.

2)
Rozumiem, że pod "ścieżkę" podstawiasz ścieżkę do danej ikony. To drugi błąd. Z tej samej strony w helpie czytamy:

(drugi parametr) Points to a null-terminated string that contains the name of the icon resource to be loaded. Alternatively, this parameter can contain the resource identifier in the low-order word and zero in the high-order word.

Tak więc tam powinna być nazwa zasobu, bądź jego identyfikator (tak, jak w Twoim użyciu funkcji UpdateResource występuje 'MAINICON').

3)
Również w tym samym pliku pomocy w opisie funkcji UpdateResource jest napisane:

(piąty parametr) Points to the resource data to be inserted into the executable file. If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data stored in the executable file, not the data provided by LoadIcon(...)

Wynika z tego jednoznacznie, że dane podawane przez Ciebie są błędne: podajesz to, co zwróci Ci funkcja LoadIcon, a tak być nie powinno.

Konkluzje:
  a)
Wiem, że bardziej uradował by Cię działający kod, a nie lista błędów, ale nigdy nie bawiłem się w podmienianie zasobów a w momencie pisania tej odpowiedzi nie miałem ochoty na naukę tego zagadnienia (jestem świeżo po morderczym treningu) - wybacz! Jednak mam nadzieję, że powyższy tekst Cię jakoś nakieruje.

  b)
Załatw sobie plik win32.hlp - 24MB czystej wiedzy!

0

Marooned, dzięki za uzmysłowienie błędów. Musiałem być chyba bardzo zmęczony, albo pijany, jak czytałem helpa, bo zrozumiałem własnie, że trzeba użyć loadicon() :). Nie mam jednak pojęcia, co mógłbym użyć zamiast, tzn. jak władować tę nieszczęsną ikonkę do pamięci. Próbowałem to zrobić za pomocą strumienia:

var
uchwyt:thandle;
strumien:tmemorystream;
begin

strumien:=tmemorystream.Create;
strumien.LoadFromFile(extractfilepath(application.ExeName)+'ikona.ico');
uchwyt:=BeginUpdateResource(PChar(extractfilepath(application.ExeName)+'plik.exe'), false);

UpdateResource(uchwyt, RT_GROUP_ICON, 'MAINICON', 1045, strumien.Memory, strumien.Size);

EndUpdateResource(uchwyt, false);

W przypadku zwykłych pllików (i drugim parametrze jako RT_RCDATA) działa to, jednak w tym przypadku nie :(

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