Mam program Windows (exe), który został napisany w Delphi (Delphi 7 myślę) kilka lat temu i ten program jest nadal używany sporadycznie. Zawiera zmienną typu pojedynczego pomnożoną przez 0.9 w pewnym punkcie kodu.Zmiana wartości zmiennoprzecinkowej w exe
Chciałbym zmienić 0.9 do 0.8 w pliku exe za pomocą edytora szesnastkowego i potrzebuję pomocy, aby znaleźć odpowiednią część kodu do zmiany.
zmienna jest zadeklarowana jako
private myValue: Single;
i po kliknięciu przycisku wartość edytować komponentu zostanie ustawiony na rundy (myValue * 0,9)
procedure MyForm.buttonClick(Sender: TObject);
begin
if button.Down then
myEditComponent.EditValue := Round(myValue * 0.9);
end;
wartość 0,9 jest używany tylko raz w cały kod, więc pomyślałem, że powinno być łatwo go znaleźć. Dowiedziałem się, że reprezentacja heksadecymalna 0.9 jako DWORD powinna być 0x3f666666, ale nie mogłem znaleźć tej wartości w exe.
Więc to albo że się mylę i 0,9 reprezentowany jest z innym ciągiem szesnastkowym lub kompilator sformułowanej tego obliczenia w inny sposób (np myValue * 9/10 lub w inny sposób) lub ..
Przed sugerujesz, aby ponownie skompilować projekt: mam kod źródłowy, ale jest to duży projekt z kilkoma zależnościami. Kod opiera się na bibliotekach pakietów wieloskładnikowych i dziesiątkach komponentów stron trzecich. Może to potrwać kilka dni, zanim zainstalujemy starą wersję Delhi i zarejestrujemy wszystkie komponenty, aby zrekompilować kod. Nie jest to coś, co chciałbym zrobić dla tak niewielkiej zmiany rzadko używanego programu.
Gdybym miał zainstalowane Delphi, wystarczyłoby napisać kilka linii kodu i rozebrać/debugować, aby zobaczyć kod zespołu. Po zgromadzeniu mogłem dowiedzieć się, co należy zmienić w exe. Mam nadzieję, że ktoś mógłby wskazać mi właściwy kierunek, więc nie muszę instalować starej wersji Delphi.
Zrobiłeś szukanie dla niego jako 66 66 66 3f w pliku? –
0.9 nie może być dokładnie odwzorowany. Najbliższym singlem jest rzeczywiście "0x3f666666". Ale skąd wiadomo, że stała jest przechowywana jako singiel. Oczywistym sposobem na wypracowanie tego jest samodzielne skompilowanie kodu i zobaczenie, co zostało pominięte. Spróbuj tego. –
@SamiKuhmonen Wypróbowałem to w ten sposób, ponieważ nie byłem pewien co do kolejności bajtów. – tinform