2016-06-11 66 views
5

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.

+3

Zrobiłeś szukanie dla niego jako 66 66 66 3f w pliku? –

+0

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. –

+0

@SamiKuhmonen Wypróbowałem to w ten sposób, ponieważ nie byłem pewien co do kolejności bajtów. – tinform

Odpowiedz

9

Stałe literowe punktu zmiennego są przechowywane jako rozszerzone w 80-bitach w 32-bitowych wersjach Delphi.

Wartość 0,9 jest przechowywana jako 66 66 66 66 66 66 66 E6 FE 3F

Dla 0,8 zastąpić go CD CC CC CC CC CC CC CC FE 3F

+0

OK, znalazłem tę sekwencję. Dziwnie znalazłem dwa przypadki. Będę je zmieniać jeden po drugim, aby zobaczyć, co się stanie. Muszę połączyć program z serwerem bazy danych, aby przetestować zmiany i może minąć trochę czasu, zanim będę miał okazję to zrobić. Jeśli to działa (myślę, że tak będzie), przyjmuję twoją odpowiedź. – tinform