jajakija: nie dośc że nie jest zbyt uprzejmy i dublujesz wątki, odpisałem Tobie już w temacie pod adresem
http://4programmers.net/Forum/viewtopic.php?id=60489 bo do końca nie wiem jak rozwiązać Twój problem
jednak Ty robisz coś całkiem bez sensu jakbyś skorzystał z helpa jak Tobie Misiekd doradził wiedział byś, że
RT_STREING w parametrze do tworzenia TResourceStreama używane jest kiedy wczytujemy StringTable, no
a ale problemem pozostaje nazwa zasobu, na pewno napisanie PChar(IdZasobu) jest bez sensu - poczytaj
najpierw o typach i co to jest PChar. Ten parametr to nazwa zasobu lub jeśli tworzymy przez CreateFromID
to jego identyfikator liczbowy podany w pliku rc na przykład #1 podane w pliku to w programie dajemy 1, a
StringTable wczytuje się poprzez LoadString, bo jak byś zamiast chamsko się odności potestował trochę to
po takim kodzie oraz podejrzeniu nawet głupim ResHackerem swojego exeka byś wiedział, że StringTables
są indeksowane dla tak wyglądającego pliku rc jak poniżej kolejno 1, 2, 3 i tak dalej. Pozostale są wyżej.
Zapisując taki plik a.rc i używając poniższego kodu dostałem oddzielony zerami kawałek tekstu z yes i No.
Kopiuj
STRINGTABLE
{
1, "&Yes"
2, "&No"
17, "&Si"
18, "&No"
33, "&Ja"
34, "&Nej"
}
Kopiuj
{$R a.res}
var
Res : TResourceStream;
begin
Res := TResourceStream.CreateFromID(hInstance, 1, RT_STRING);
Res.SaveToFile('D:\test.bin');
Res.Free;
end;
Ale do ładowania stringów używa się LoadString. Do ich zapisu w exe musisz użyć takiego kodu jak niżej, w
sumie z moich testów wynika że działa ok. Po prostu pod ResHackiem sobie możesz zobaczyć jaki numer w
StringTables ma tablica stringów jaką chcesz podmienić i podawać zamiast '1' ten numer jako tekst. Czyli
Twój problem polegał na tym że zniechęciłeś całkiem MisiekD do pomocy, zamiast tak jak Ci radził zajrzeć
do Helpa. Nie wiem tylko czy taka podmiana stringtable na pewno zawsze zadziała ok, ale sam to sprawdź.
Kopiuj
var
hUpdateRes : THandle;
Res : TResourceStream;
begin
Res := TResourceStream.CreateFromID(hInstance, 1, RT_STRING);
hUpdateRes := BeginUpdateResource(PCHAR('D:\test.exe'), False);
UpdateResource(hUpdateRes, RT_STRING, '1', LANG_NEUTRAL, Res.Memory, Res.Size);
EndUpdateResource(hUpdateRes, False);
end;
Oczywiście zamiast ResHackera możesz użyć innego edytora zasobów, jest ich trochę. A i StringTables jaką
podałem to przykładowa tablica wzięta z jakiegoś artykułu w google. W sumie w google jest to dośc dobrze
opisane, ale nie do końca. Moze pozostawiono pole do własnych prób, na które chyba Ty byłeś za leniwy ;/
EDIT: no zdążyłem po testach zakończyć posta, a jajakija już sobie chyba poradziłeś. Jak widzisz "problem"
był w sumie dosyć banalny i wniosek dla Ciebie żeby zawsze spojrzeć najpier do helpa oraz pogooglować :)