Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
Интерфейс моего инструмента полностью изменен. Учтены если не все, то почти все Ваши замечания. Пока все это только в разработке. Посмотрите пожалуйста ScanStCounter Может еще что ни будь подскажите.
Скачал вашу работу. Эх...
Попытка №1 1) Загрузил файл SUFDesign.exe 2) Указал кодировку Windows-1251 3) Импортировал строки из файла SetupFactory.rdmp - все строки со статусом ОК 4) Нажал "Подготовка" - Ошибка
Попытка №2 1) Загрузил файл SUFDesign.exe 2) Указал кодировку Windows-1251 3) Создал список вручную, введя только те строки, для которых необходимо изменить счетчики 4) Нажал "Подготовка" - та же самая Ошибка
Несмотря на ошибку в обеих случаях, закрываю её и нажимаю "Записать в файл". Снова выскакивает тоже сообщение. Ну а в файл естественно ничего не записалось.
Замечания: 1) Начальное окно "Увлекательный рассказ" не отключается, плюс оно убеждает пользователя в том, что перед ним игрушка, а не серьезный инструмент. Во-вторых позиция вывода этого окна где-то с краю. Обычно вывод главного окна программы позиционируют по центру (свойство Position = poScreenCenter), а все его дополнительные окна и сообщения привязывают к позиции главного окна (свойство Position = poMainFormCenter). В данном случае я в редакторе ресурсов сразу же добавил формам TMainForm и TScreenForm свойство Position = poScreenCenter. Сразу намного улучшилось общее восприятие программы.
2) Заголовок "Английский текст" желательно заменить на "Исходный текст", т.к. текст может быть не только на английском.
3) Заголовок "Русский текст" желательно заменить на "Перевод", т.к. текст могут переводить не только на русский, а любой другой, например, на украинский.
4) Попытка навязать пользователю определенную последовательность действий, которая тут же ломается, если, к примеру, после этапа "Список строк" нажать "Загрузить файл" и выбрать другой файл - пройденные этапы останутся активны. Т.е. кнопки пройденных этапов или нужно блокировать, или показывать пользователю предупреждение, что данные будут сброшены и т.д. и т.п. Ну и, естественно, если он решил продолжить, то выполнять общий сброс и обнулять данные.
5) Кнопка с картинкой "Запомнить" - почему бы просто не сделать кнопку "Добавить в список", ну или просто "Добавить".
6) Сохранение списка строк в каких-то НЕХ-кодах, что не дает возможности его ни отредактировать, ни дополнить. Зачем? Не проще ли было бы использовать что-то типа INI-формата:
Вы сами создаете себе трудности, а затем стойко пытаетесь их преодолеть. Я понимаю, что так вы хотели сохранить кодировку строк, но можно же просто сохранить документ в нужной кодировке Windows-1251, UTF-8 и т.д.
Ок, ладно, пока добейтесь, чтобы программа исправно выполняла свою работу. На этом и остановимся.
Спасибо за потраченное время. Инструмент не готов для выхода в свет. Начальное окно (Вы так его назвали) по моему замыслу должно служить некоторым подобием мастера (должно помочь ознакомиться с инструментом) Оно будет привязано к верхнему правому краю главного окна, чтобы не мешать пользователю выполнять действия. Легкомысленный тон (стиль) выбран преднамеренно, чтобы показать - это не сложный для освоения прибор, не требует специальных знаний и навыков... Окно закрывается системной кнопкой, а переключатель "Хватит меня учить" - аналог "Не открывать это окно при следующем запуске"
На этом этапе инструмент может то, что мог ИДАЗПСД (немножко больше, в FontLab есть еще один вариант, допускающий удлинение строк до 65535 байтов). В ИДАЗПСД была функция анализа, она была довольно строгая (поэтому требовалось не больше 3 сток). Если все эти проверки включить в этап подготовки, то процесс значительно замедлится (на 200 строк FontLab требовалось больше 10 минут). Конечно же, я разберусь с появлением ошибки, тем более SUFDesign.exe Вы мне передали. Явное переполнение типа integer. Посмотрю, возможно нужно перейти на тип Cardinal или добавить проверку. Кстати, файл Вы мне передали, но попытка найти в интернете программу целиком не удалась, предлагают какую-то ерунду. чтобы составить алгоритм, мне нужно запустить программу в отладчике, чтобы проверить результат, тоже нужна исполнимая программа.
Замечание 2, 3 и 5 легко принимаются и легко исправляются (5 сложнее - не люблю работать с картинками)
Замечание 4 - сложное. ИДАЗПСД весьма строго ограничивал пользователя - стал недоступным и все. Только перезапускать. Тут, я по Вашему же "ворчанию", предположил, что пользователь с головой и не будет работать с файлом, в котором таких строк явно нет. Поэтому я разрешил пользователю работать со списком строк без загруженного файла (мало ли с какой целью). Другое дело кодировка. При попытке изменить кодировку существующего или загружаемого списка строк, пользователю будет предоставлена возможность преобразовать. Я заранее не могу знать, загрузил ли пользователь соответствующий файл первоначально, может он загрузит его позже. И что я должен сделать с подготовкой - очистить список строк?. Писать сообщение? Автоматически выполнять подготовку? В конце концов, ничего страшного не произойдет - перед записью в файл выполняется укороченный вариант подготовки - без составления отчета и изменений в столбце "Ошибки".
6 - это основополагающее - мне встречался требующий перевода текст (не строка, а текст) Все строки хранятся и обрабатываются в типе TStringList. Он может содержать только строки и не может текст. Если записывать текст в виде кода, тогда это будет строка (изначально я работал с компонентами Memo и чтобы была возможность работать с текстом, составлялся список строк в специальном формате и сохранялся в файле "Source.txt", а когда Вы подсказали мне компонент TVirtualStringTree, который может содержать в ячейках текст, тогда и был выбран TStringList И вообще, не предполагается, что пользователь будет в ручную редактировать эти файлы. Все они четко связаны между собой и редактировать запрещено. (наверно нужно добавить им атрибут "только для чтения"
Я думаю, что Вы воспринимаете мою писанину правильно. Я не оправдываюсь, я объясняю свою логику. Так же, как и Ваши замечания, предложения и критику, я воспринимаю не как "придирку", а как добрый совет, приемлемое или неприемлемое предложение. Вы мне очень помогаете. Спасибо Вам С уважением, Николай
Кстати, файл Вы мне передали, но попытка найти в интернете программу целиком не удалась, предлагают какую-то ерунду. чтобы составить алгоритм, мне нужно запустить программу в отладчике, чтобы проверить результат, тоже нужна исполнимая программа.
Есть такой ресурс - Internet Archive - архив интернета по годам и датам. Можно найти то, что якобы уже давно кануло в Лету (например, сайт не существует, перехал на другой домен, на сайте доступна только актуальная версия программы). Конечно же ресурс НЕ содержит ВСЕ и пополняется только за счет пользователей. Ссылка на инсталлятор из официального источника с интернет архива.
Сообщение отредактировал Leserg 20 января 2024 - 22:21
Адреса команды lea в файле: 105CFAD, 1617353, 1980625 соответственно.
Ссылки: 02FFF64C, 02A452A6, 026DBFD4 соответственно.
Адрес строки: 03C98200 (в файле)
В отличии от 32-разрядной версии FontLab 8 (в ней, чтобы найти ссылку, нужно к адресу строки нужно добавлять заранее вычисленное постоянное значение), здесь это значение плавает и четко зависит от смещения команды и смещения строки. (чем больше «расстояние» между смещением команды и смещением строки, тем значение ссылки больше)
Зная адрес ссылки и адрес строки можно легко вычислить значение некоторую постоянную: (ссылка - (Адрес строки – адрес команды) = постоянная = 02FFF64C - (03C98200 - 0105CFAD) = 02FFF64C - 2C3B256 = 003C43F9
Теперь, зная ссылку и адрес команды можно вычислить соответствующий адрес строки (Адрес строки = ссылка + адрес команды - постоянная величина = 02FFF64C + 0105CFAD - 003C43F9 = 03C98200) (это верно для десятка проверенных строк)
Однако, вычислить адрес команды, или значение ссылки, зная только адрес строки, невозможно (две неизвестных, а систему уравнений я составить не смог). Решил попробовать решить проблему следующим алгоритмом:
1. В цикле ищем команду lea – 4c8d0d и проверяем, чтобы перед ней стояло значение, соответствующее размеру оригинальной строки. (для строки «Шрифт:» ищем цепочку 00 00 00 05 4c 8d 0d) 2. Если такая цепочка нашлась, то проверяем, соответствует ли значение ссылки адресу строки (все данные для вычисления есть). Если соответствует, значит значение счетчика можно изменить, если нет, ищем дальше.
Я уже было начал искать возможность вычисления постоянной на основе данных РЕ-заголовка, но вспомнил про Radialix, он же каким-то способом находит ссылки (впрочем, может этим занимается IDA). Не используется же придуманный мной алгоритм. Не могу себе представить, как можно только на основе адреса строки найти ссылку! Строка одна, а ссылок на нее несколько и все разные. Как можно заранее знать, сколько на строку ссылок и адреса команд, которые используют (загружают) строку по этой ссылке.
Может у кого-то есть идеи, может кто-то может описать механизм, которым пользуется Radialix (или IDA) или тот же отладчик. (Понятно, что «кого-то» и «кто-то» это Leserg)
Может у кого-то есть идеи, может кто-то может описать механизм, которым пользуется Radialix (или IDA) или тот же отладчик. (Понятно, что «кого-то» и «кто-то» это Leserg)
Я не имею ни малейшего понятия, как это делают Radialix (или IDA) или тот же отладчик. За мою практику локализации (с 2004 года) мне ни разу не приходилось корректировать счетчики в более чем 10-15 строк. Обычно от 1 до 7 и с этим очень просто справится в отладчике. Чуть позже я разобрался, как искать ссылки в 32-рязрядных приложениях. Но что касается 64-разрядных приложений - здесь я пас. Информации ноль. А формулы расчета для 32-разрядных приложениях не подходят для 64-разрядных - данные никак не бьются. Чес слово - пёс его знает.
Касательно данной программы и примера строки "Font:". В НЕХ редакторе хорошо видно, что адрес в команде LEA - это дистанция между командой и строкой, плюс 200 - некая константа, действительная только для этого файла. Но это тоже можно рассчитать не базе известных значений VA и RAW в секциях.
Таким образом, чтобы найти ссылки для данной строки (или какой-то другой) нужно перебирать все возможные значения адресов в секции кода относительно строки. Бред конечно. И вряд ли так действуют отладчики при поиске перекрестных ссылок.
Цитата: NNK_RTR
Решил попробовать решить проблему следующим алгоритмом: 1. В цикле ищем команду lea
Это в корне не верно. Так можно найти данные, которые никоим образом не относятся к строке (и к строкам вообще). Как итог - повреждение программы.
Теперь мне стало понятно (точнее, думаю, что стало понятно) почему Radialix находит ссылки в FontLab 8 - 32 самостоятельно (без IDA), а в FontLab 8 - 64, без IDA он слеп. Отладчик загружает файл, а IDA имитирует загрузку. Другими словами, ссылками занимается загрузчик. Мне абсолютно не понятен этот механизм. В Интернете информации не нашел (толковой и понятной). Загрузка DLL - пусть не в деталях, но в целом понятна. Неужели загрузчик глубоко вникает в файл и исследует и корректирует все ссылки, ведущие в другую секцию?!
Это сейчас, (во время написания) пришло мне в голову: При остановке отладчика на системной точке останова все секции уже загружены, переведенные строки присутствуют, но ссылок на них еще нет (отладчик найти не может). После остановки на точке входа, ссылки уже есть. (отладчик их с удовольствием находит). Не здесь ли собака порылась (или зарыта)! Прервал писанину и проверил - код (команды) выглядит, как обычно и переход в дамп по константе приводит куда нужно (у меня на команды стоят точки останова, поэтому нашел команду быстро) По всей вероятности, в промежуток между системной точкой останова и остановкой на точке входа, загружаются библиотеки (во всех случаях, на странице "Карта памяти" их стало значительно больше. В общем, проблема, но я надеюсь, что вникать не придется.
Цитата: Leserg
Это в корне не верно. Так можно найти данные, которые никоим образом не относятся к строке (и к строкам вообще). Как итог - повреждение программы
Не думаю. Код должен быть уникальным. Я вручную проверил свой алгоритм на разных строках (всего 5). Ошибки не было. Можно ужесточить проверку - проверять, какая именно команда передает показания счетчика. (Возможно MOV или LEA). По большому счету, ошибки в принципе не может быть: Команда LEA RCX [02A452A6] загрузит в RCX эффективный (действительный) адрес строки (или чего угодно). Поскольку по этому адресу находится переведенная строка, то ее адрес и будет загружен. Причем будет загружен во всех случаях, изменю я показания счетчика или нет.
Постоянная 003C43F9, действительно будет работать только для конкретного файла. В другом файле может быть другое количество секций да размер секций может быть разный. Вот я уже второй день бьюсь, как муха о стекло, чтобы научиться вычислять это значение на данных заголовка файла
На Вашем скриншоте расстояние между адресом команды и адресом строки ближе, и вычисленная Вами постоянная меньше (200). Завтра посмотрю, меняется ли эта постоянная в пределах секции (в оригинальном файле) по идее - нет (на то она и постоянная), может найду такую команду со ссылкой на соседнюю секцию и попробую понять как постоянная изменяется, в зависимости от секции, в которой расположен источник.
Разобрался я в конце концов с озвученной выше проблемой, то есть, нашел способ вычисления постоянной на основе извлеченных из РЕ-заголовка данных. Основная ошибка была в том, что я ссылки воспринимал, как прямые, а они относительные - к адресу команды нужно добавить величину ссылки, чтобы перейти на адрес строки. Спасибо форумчанам за "активную" помощь! Если кому интересен ход и результат моих размышлений, то с ним можно ознакомиться ЗДЕСЬ