2016-06-11 2 views
5

J'ai un programme Windows (exe) qui a été écrit en Delphi (Delphi 7 je pense) il y a plusieurs années et ce programme est encore utilisé occasionnellement. Il contient une variable de type unique qui est multipliée par 0,9 à un certain point dans le code.Modification de la valeur en virgule flottante dans exe

Je voudrais changer 0,9 à 0,8 droite dans le fichier exe en utilisant un éditeur hexadécimal et j'ai besoin d'aide pour trouver la partie pertinente du code à modifier.

La variable est déclarée comme

private myValue: Single; 

et quand un bouton est cliqué la valeur d'édition d'un composant se prépare à Round (maValeur * 0,9)

procedure MyForm.buttonClick(Sender: TObject); 
begin 
    if button.Down then 
    myEditComponent.EditValue := Round(myValue * 0.9); 
end; 

La valeur 0,9 est utilisée qu'une seule fois dans tout le code alors j'ai pensé qu'il devrait être facile de le trouver. J'ai appris que la représentation hexadécimale de 0.9 en tant que DWORD devrait être 0x3f666666 mais je n'ai pas pu trouver cette valeur dans l'exe.

Il est donc soit que je me trompe et 0,9 est représenté avec une chaîne hexagonale différent ou le compilateur formulé ce calcul d'une autre manière (comme maValeur * 9/10 ou d'une autre manière) ou ..

Avant vous suggérez de recompiler le projet: j'ai le code source mais c'est un gros projet avec plusieurs dépendances. Le code repose sur plusieurs bibliothèques de packs de composants et des dizaines de composants tiers. Cela peut prendre quelques jours juste pour obtenir et installer une ancienne version de Delhi et enregistrer tous les composants afin de recompiler le code. Pas quelque chose que je voudrais faire pour un si petit changement d'un programme rarement utilisé.

Si j'avais installé Delphi, j'écrirais simplement ces quelques lignes de code et je le désassemblerais/déboguerais afin de voir le code d'assemblage. Ayant l'assemblée je pourrais comprendre ce qui doit être changé dans l'exe. J'espère que quelqu'un pourrait me diriger dans la bonne direction, donc je n'ai pas besoin d'installer une ancienne version de Delphi.

+3

Vous avez recherche comme 66 66 66 3f dans le fichier? –

+0

0.9 ne peut pas être exactement représenté. Le single le plus proche est en effet '0x3f666666'. Mais comment pouvez-vous savoir que la constante est stockée en tant que simple. La façon évidente de faire cela est de compiler le code vous-même et de voir ce qui est omis. Essayez ça. –

+0

@SamiKuhmonen Je l'ai essayé aussi parce que je n'étais pas sûr de l'ordre des octets. – tinform

Répondre

9

Les constantes littérales à virgule flottante sont stockées sous la forme d'une extension 80 bits dans les versions 32 bits de Delphi.

Une valeur de 0,9 est stockée sous forme 66 66 66 66 66 66 66 E6 FE 3F

Pour le remplacer par 0,8 CD CC CC CC CC CC CC CC FE 3F

+0

OK, j'ai trouvé cette séquence. Bizarrement, j'ai trouvé deux cas. Je vais les changer un par un pour voir ce qui se passe. Je dois connecter le programme au serveur de base de données pour tester les modifications et cela peut prendre un certain temps avant que je puisse le faire. Si cela fonctionne (je crois que ce sera le cas), j'accepterai votre réponse. – tinform