2016-06-11 18 views
5

Tôi có một chương trình Windows (exe) được viết bằng Delphi (Delphi 7 tôi nghĩ) vài năm trước và chương trình đó vẫn được sử dụng thỉnh thoảng. Nó chứa một biến kiểu đơn được nhân với 0,9 tại một số điểm trong mã.Thay đổi giá trị dấu phẩy động trong exe

Tôi muốn thay đổi 0,9 đến 0,8 ngay trong tệp exe bằng trình chỉnh sửa hex và tôi cần trợ giúp để tìm phần có liên quan của mã cần thay đổi.

Biến được khai báo là

private myValue: Single; 

và khi một nút được nhấp chỉnh sửa giá trị của một thành phần được thiết lập để Round (myValue * 0,9)

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

Giá trị 0.9 chỉ được sử dụng một lần trong toàn bộ mã nên tôi nghĩ sẽ dễ dàng tìm thấy nó. Tôi đã học được rằng các đại diện hex của 0,9 như một DWORD nên được 0x3f666666 nhưng tôi không thể tìm thấy giá trị đó trong exe.

Vì vậy, nó là một trong hai rằng tôi sai và 0.9 được biểu diễn bằng một chuỗi hex khác nhau hoặc trình biên dịch công thức tính toán này theo một cách khác (như myValue * 9/10 hoặc một số cách khác) hoặc ..

Trước bạn đề xuất rằng tôi biên dịch lại dự án: Tôi có mã nguồn nhưng nó là một dự án lớn với một số phụ thuộc. Mã này dựa trên nhiều thư viện gói thành phần và hàng tá thành phần của bên thứ ba. Nó có thể mất một vài ngày chỉ để có được và cài đặt một phiên bản cũ của Delhi và đăng ký tất cả các thành phần để biên dịch lại mã. Không phải cái gì tôi muốn làm cho một sự thay đổi nhỏ như vậy của một chương trình không thường xuyên sử dụng.

Nếu tôi đã cài đặt Delphi, tôi chỉ viết vài dòng mã này và tháo gỡ/gỡ lỗi để xem mã lắp ráp. Có lắp ráp tôi có thể tìm ra những gì cần phải được thay đổi trong exe. Tôi hy vọng một người nào đó có thể chỉ cho tôi đi đúng hướng vì vậy tôi không phải cài đặt một phiên bản cũ của Delphi.

+3

Bạn đã tìm kiếm nó như 66 66 66 3f trong file? –

+0

0,9 không thể được biểu diễn chính xác. Đĩa đơn gần nhất thực sự là '0x3f666666'. Nhưng làm thế nào bạn có thể biết rằng hằng số được lưu trữ như một đĩa đơn. Cách rõ ràng để làm việc này là tự biên dịch mã và xem những gì bị bỏ qua. Hãy thử điều đó. –

+0

@SamiKuhmonen Đã thử nó theo cách đó vì tôi không chắc chắn về thứ tự byte. – tinform

Trả lời

9

Hằng số dấu chấm động được lưu trữ dưới dạng mở rộng 80 bit trong phiên bản 32 bit của Delphi.

Một giá trị 0.9 được lưu giữ như 66 66 66 66 66 66 66 E6 FE 3F

Đối 0.8 thay thế nó với CD CC CC CC CC CC CC CC FE 3F

+0

OK, tôi đã tìm thấy chuỗi đó. Kỳ lạ là tôi tìm thấy hai trường hợp. Tôi sẽ thay đổi từng cái một để xem điều gì xảy ra. Tôi phải kết nối chương trình với máy chủ cơ sở dữ liệu để kiểm tra các thay đổi và có thể mất chút thời gian trước khi tôi có cơ hội làm điều đó. Nếu nó hoạt động (tôi tin rằng nó sẽ) Tôi sẽ chấp nhận câu trả lời của bạn. – tinform

Các vấn đề liên quan