-
Добрый день. Вот и наступила деноминация в Белоруси.
Обнаружилась проблема, что сумма с копейками пишется прописью неверно.
Начал копаться, обнаружил такой код:
function KopToText(const Summa: Currency; const shablon: string): string; var strl: Tstrings; i: integer; S, sCopName: string; copIn: Int64; begin copIn := strtoint(copy(replaceDQ(floattostr(SimpleRoundTo(frac(Summa))), '0.', ''), 1, 2)); ....
Далее copIn скармливается этой функции:
function Kopeika(const Value: integer; const Skp: string): string; var hk10, hk20: integer; Skp1, Skp2, Skp3: string; begin Fst(Skp, Skp1, Skp2, Skp3); hk10 := Value mod 10; hk20 := Value mod 100; //showmessage(inttostr(hk10) + ', ' + inttostr(hk20)); if (hk20 > 10) and (hk20 < 20) then result := result + Skp3 else if (hk10 = 1) then result := result + Skp1 else if (hk10 > 1) and (hk10 < 5) then result := result + Skp2 else result := result + Skp3; end;
Уродливость кода опустим.
Проблема в том, что
copIn := strtoint(copy(replaceDQ(floattostr(SimpleRoundTo(frac(Summa))), '0.', ''), 1, 2));
При Summa = 0.4 возвращает 4, а надо бы 40.
Вопрос: как это исправить без пересборки?
Пересборка оголит другие проблемы.
-
> Пересборка оголит другие проблемы.
Так может это и хорошо? Известная проблема лучше, чем скрытая.
-
> Юрий Зотов © (01.07.16 10:40) [1] > > Пересборка оголит другие проблемы. > > Так может это и хорошо? Известная проблема лучше, чем скрытая.
Нет на это времени, к сожалению. Проблему нужно решить "райт мяу".
-
> Так может это и хорошо?
только когда времени валом чтобы собирать релизный билд для одного фикса без промежуточных наработок
-
> backuper (01.07.16 11:13) [3] > > > Так может это и хорошо? > > только когда времени валом чтобы собирать релизный билд > для одного фикса без промежуточных наработок
А причем тут "промежуточные наработки"? Берется из системы контроля версий версия исходников на нужную дату в прошлом. Исправляется в одном месте и пересобирается.
-
Уже второй раз пытаешься что-то исправить без пересборки за последнее время. Тут по-моему что-то с консерваторией не так.
-
> Берется из системы контроля версий версия исходников на > нужную дату в прошлом
ее нет, иначе этой темы не было бы
-
CPU Disasm
Address Hex dump Command Comments
007EDD78 |. E8 8B56C1FF CALL 00403408 ; ||[hotel.00403408
Ребят, объясните, пожалуйста, как из 8B56C1FF получилось 00403408?
-
это не адрес, а смещение; смещения бывают положительными и отрицательными
-
> Sha © (01.07.16 15:18) [8] >
Спасибо. Просто по этому адресу находится функция TRUNC, а мне нужна еще ROUND, которая не вызывается в исходной функции. Я хочу найти ее с помощью относительного пути, т.к. компилятор совпадает, должно сработать. Еще вопрос: Код по вычленению копеек скопмилировался у меня так:
copIn := Round(SimpleRoundTo(Frac(Summa) * 100, 0));
007EDD66 |. DF6D 08 FILD QWORD PTR SS:[EBP+8]
007EDD69 |. D835 10E07E00 FDIV DWORD PTR DS:[7EE010] ; FLOAT 10000.00
007EDD6F |. E8 9456C1FF CALL 00403408 ; [hotel.00403408
007EDD74 |. D80D 14E07E00 FMUL DWORD PTR DS:[7EE014] ; FLOAT 100.0000
007EDD7A |. 83C4 F8 ADD ESP,-8
007EDD7D |. DD1C24 FSTP QWORD PTR SS:[LOCAL.28] ; /Arg1_2
007EDD80 |. 9B WAIT ; |
007EDD81 |. 33C0 XOR EAX,EAX ; |
007EDD83 |. E8 08D3C4FF CALL 0043B090 ; \hotel.0043B090
007EDD88 |. E8 9F56C1FF CALL 0040342C
007EDD8D |. 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX
007EDD90 |. 8955 E4 MOV DWORD PTR SS:[EBP-1C],EDX
1. FDIV DWORD PTR DS:[7EE010]: 7EE010 - это адрес или значение? Что там должно лежать по этому адресу и как? 2. DD1C24 FSTP QWORD PTR SS:[LOCAL.28]: Что делает эта строка?
-
> DayGaykin © (01.07.16 16:09) [9]
Может уже пора взять книжку в руки?
-
> 7EE010 - это адрес или значение?
Это адрес он в []. По этому адресу лежит константа 10000.00, лежит как FLOAT
FSTP QWORD PTR SS:[LOCAL.28]: F - FPU S-Store-сохранение QWord =8 байт = SizeOf(Double)
Очевидно что сохраняет результат из сопроцессора в стек, в локальную переменную.
-
> Pavia © (01.07.16 16:29) [11]
Спасибо.
> Sha © (01.07.16 16:26) [10] > > DayGaykin © (01.07.16 16:09) [9] > > Может уже пора взять книжку в руки?
Мне нужно решить эту задачу один раз и очень срочно.
-
Еще вопрос: Как писать/читать в удаленный процесс я понимаю. Но для начала нужно найти куда писать, а для этого нужно определиться с диапазонами памяти процесса. Как узнать список диапазонов адресов памяти процесса? Есть ли возможность получить память только кода?
-
Так в левой колонке адрес и указан 007EDD66 А ещё лучше поставте галочку генерировать MAP-файл. Там будет адрес для каждой строки кода и для начало каждой функции.
-
Pavia © (01.07.16 18:55) [14] Т.к. билды у клиентов немного отличаются, я хочу сделать универсальный патчер. Поэтому хочу применить поиск. Map файла уже нет к этим билдам, в добавок он еще и запакован.
-
Сделал. Код непричесанный, но если кому-то нужен как пример - обращайтесь. Могу сюда выложить.
Работает так: 1. Моя программа запускает ту самую и ждет пока она распакуется в памяти (обычный sleep). 2. Перебирает все диапазоны адресов и ищет в них сигнатуру. 3. Когда находит, проверяет ее дополнительно и достает необходимые адреса. 4. Подготавливает и записывает другой код. 5. Закрывается и остается только та самая программа.
Еще один вопрос: Насколько сложно поправить EXE файл той-самой программы, чтобы она, к примеру, импортировала DLL и выполняла какую-то функцию из этой DLL? Чтобы хот патч встроить в саму программу.
-
-
> NoUser © (02.07.16 17:46) [17] > > в добавок он еще и запакован > > > Чтобы хот патч встроить в саму программу. > > гы, уже распаковал ))
В смысле? Я просто жду 500 мс пока он сам себя распакует. Вроде как-то можно подождать когда начнет работать оконный цикл, но времени уже нет разбираться. > MS-овцы, походу, тоже не любят лишний раз билдить своё достояние: > > > http://support.microsoft.com/en-us/kb/197571
Интересно, почему вирусмейкеры этим не пользуются (на моей памяти ни разу). Это же жеее! :)
-
> DayGaykin © (01.07.16 21:08) [16]
добавят вашу программу в антивирусные базы, будет еще чем позаниматься. в [4] дан ответ. что там за адские по размеру проекты с такого уровня разработчиками, что за 4 дня нельзя билд собрать. края крайние..
-
Проблему я уже решил. Всем спасибо.
-
Суровы белорусские программисты!
-
> в [4] дан ответ.
не ответ, а совет.
-
> Eraser © (03.07.16 20:22) [19] > > > DayGaykin © (01.07.16 21:08) [16] > > добавят вашу программу в антивирусные базы, будет еще чем > позаниматься. > в [4] дан ответ. что там за адские по размеру проекты с > такого уровня разработчиками, что за 4 дня нельзя билд собрать. > края крайние..
Ля-ля на форуме каждый мастер.
В итоге проблем с деноминацией в программе оказалось настолько много, что пришлось таки пересобрать программу и отлаживать программу с базой каждого клиента.
Это заняло время, но сейчас я понимаю, что это было единственное правильное решение.
Спасибо еще раз.
|