Ho un programma per Windows (exe) che è stato scritto in Delphi (Delphi 7 credo) diversi anni fa e quel programma è ancora usato occasionalmente. Contiene una variabile di tipo Singolo che viene moltiplicata per 0,9 ad un certo punto nel codice.Modifica del valore in virgola mobile in exe
Vorrei cambiare da 0,9 a 0,8 proprio nel file exe utilizzando un editor esadecimale e ho bisogno di aiuto per trovare la parte rilevante del codice da modificare.
La variabile è dichiarata come
private myValue: Single;
e quando un pulsante viene premuto il valore di modifica di un componente viene impostato su Round (myValue * 0,9)
procedure MyForm.buttonClick(Sender: TObject);
begin
if button.Down then
myEditComponent.EditValue := Round(myValue * 0.9);
end;
Il valore 0,9 viene utilizzato solo una volta in l'intero codice quindi ho pensato che fosse facile trovarlo. Ho appreso che la rappresentazione esadecimale di 0.9 come DWORD dovrebbe essere 0x3f666666 ma non ho trovato quel valore nel file exe.
Quindi è uno che ho torto e 0,9 è rappresentato con una stringa esadecimale diverso o il compilatore formulato questo calcolo in un modo diverso (come myValue * 9/10 o qualche altro modo) o ..
Prima suggerisci di ricompilare il progetto: ho il codice sorgente ma è un progetto grande con diverse dipendenze. Il codice si basa su librerie di componenti multipli e dozzine di componenti di terze parti. Potrebbero essere necessari un paio di giorni solo per ottenere e installare una vecchia versione di Delhi e registrare tutti i componenti per ricompilare il codice. Non qualcosa che mi piacerebbe fare per un piccolo cambiamento di un programma usato raramente.
Se avessi installato Delphi, scriverò semplicemente queste poche righe di codice e lo disassemblerò/eseguirò il debug per vedere il codice assembly. Avendo l'assemblea ho potuto capire cosa deve essere cambiato nel exe. Spero che qualcuno possa indicarmi la direzione giusta, quindi non devo installare una vecchia versione di Delphi.
hai fatto ricerca di esso come 66 66 66 3f nel file? –
0.9 non può essere rappresentato esattamente. Il singolo più vicino è infatti '0x3f666666'. Ma come puoi sapere che la costante è memorizzata come un singolo. Il modo più ovvio per risolvere questo problema è compilare il codice da soli e vedere cosa viene omesso. Prova questo. –
@SamiKuhmonen Ho provato anche in questo modo perché non ero sicuro riguardo l'ordine dei byte. – tinform