Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

PE Viewer 3.0
Goto page Previous  1, 2, 3 ... , 10, 11, 12  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Destiny



Joined: 15 Dec 2015
Posts: 250

Post (Separately) Posted: Tue Oct 15, 2024 00:57    Post subject: Reply with quote

Понадобилось тут как-то нам внедрить свой блок VERSIONINFO в свою программу.
Причем чтобы и на русском и на английском было видно, когда смотришь в Свойствах-Подробно в Проводнике...
И вот после внедрения блока и проверки/просмотре в вашем плагине и в плагине fileinfo и после
многократного перечитывания https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
появились вопросы, замечания?/указания на возможные баги?

Итак, всё началось с создания ресурса. Замечаем на фотке сразу: какие поля есть в редакторе и какие их значения.

И вот что есть у вас:
Name: в редакторе "Узел версии", в плагине "1".
Язык: в редакторе указан Русский, в плагине "Английский"...
Вопрос - КАК такое может быть? Далее - а откуда ВООБЩЕ возможна тут, на этом уровне представления данных, эта
информация о некоей кодовой странице? Она применяется к чему? Ко всему блоку???
В ссылке /learn.microsoft.com ни о чем таком нет инфы.
Да и для чего указывается 0 (ANSI)? В ресурсах же IDE мы видим, что указывается ЛИШЬ и ТОЛЬКО сам язык. Русский и .
Если информации нет для поля (а само поле вы убирать не хотите для стабильности GUI) - значит надо указать фразу
"неприменимо" или "нет данных" - в зависимости от обстоятельств.

Кстати, а что такое этот Тип 16? Вроде тип в этой структуре согласно справке константа 1 - и означающая, что это блок
с VERSIONINFO. А у вас что тут подразумевается? Вообще - какие тогда типы с какими константами вы знаете/выводите?

Теперь открываем файл в плагине FileInfo и видим:
Language : Английский (США) (0x409)
Character Set : 1200 (ANSI - Unicode (BMP of ISO 10646)) (0x4B0)
Язык тоже Инглиш. И тут же уже хотя бы 1200! а не `0` какой-то - как у вас. И это правильный вывод - т.к. мы оформили
соответствующие блоки строковых данных для двух языков в Юникодной кодировке. Пример оформления см. ниже в виде
куска кода из *.rc файла.

А вот касательно 0... Есть файл AkelPad64.exe. Так для него FileInfo показывает-таки этот 0, но
это показ в форме строки: Not referenced (0x0)! Т.е. именно в том ключе, как я выше и предлагал:
"Если информации нет для поля (а само поле вы убирать не хотите для стабильности GUI) - значит надо указать фразу
"неприменимо" или "нет данных" - в зависимости от обстоятельств."

А ваш же плагин по-прежнему пишет (0) (ANSI - кириллица) - явно баг получается.

Далее. Помните, выше я сказал, что нам надо двуязычность этого ресурса? RU + EN.
Казалось бы в справке четко указано: надо сделать в структуре StringFileInfo столько блоков StringTable, сколько
языков надо охватить. Причем в начале блока указывается "lang-charset", который содержит инфу о текущем языке.
Хорошо, в файле ресурсов *.rc так и сделали.
Code:

//040904B0 = 0x0409 (1033, U.S. English) + 0x04B0 (1200, Unicode) or 0x04E4 (1252, Multilingual, Western Europe)
#ifdef UNICODE
    BLOCK "040904B0"
#else
    BLOCK "040904E4"
#endif
    BEGIN
      VALUE "CompanyName",      VER_COMPANYNAME_STR
      VALUE "FileDescription",  VER_FILEDESCRIPTION_STR
      VALUE "FileVersion",      VER_FILEVERSION_STR
      VALUE "InternalName",     VER_INTERNALNAME_STR
      VALUE "LegalCopyright",   VER_LEGALCOPYRIGHT_STR
      VALUE "LegalTrademarks",  VER_LEGALTRADEMARKS_STR
      VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
      VALUE "ProductName",      VER_PRODUCTNAME_STR
      VALUE "ProductVersion",   VER_PRODUCTVERSION_STR
    END
//041904E3 = 0x0419 (1049, Russian) + 0x04B0 (1200, Unicode) or 0x04E3 (1251, Cyrillic)
#ifdef UNICODE
    BLOCK "041904B0"
#else
    BLOCK "041904E3"
#endif
    BEGIN
      VALUE "CompanyName",      VER_COMPANYNAME_RUSTR
      VALUE "FileDescription",  VER_FILEDESCRIPTION_RUSTR
      VALUE "FileVersion",      VER_FILEVERSION_STR
      VALUE "InternalName",     VER_INTERNALNAME_STR
      VALUE "LegalCopyright",   VER_LEGALCOPYRIGHT_RUSTR
      VALUE "LegalTrademarks",  VER_LEGALTRADEMARKS_RUSTR
      VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
      VALUE "ProductName",      VER_PRODUCTNAME_RUSTR
      VALUE "ProductVersion",   VER_PRODUCTVERSION_STR
    END
  END

Вроде всё правильно. Теперь надо указать доступность этих самых языков. Вроде как согласно справке для
этого используется следующий блок:
Code:

  BEGIN
#ifdef UNICODE
    VALUE "Translation", 0x0409, 0x04B0, 0x0419, 0x04B0
#else
    VALUE "Translation", 0x0409, 0x04E4, 0x0419, 0x04E3
#endif
  END

Ок, собран проект, открыт файл в вашем плагине и внутри блока StringFileInfo корректно видны
два суб-блока StringTable. Это StringTable 0 и StringTable 1. Внутри них видны корректные записи.
И это супер плюс. А вот что же насчет блока VarFileInfo для Translation?
Code:

VarFileInfo
{
    Translation 0: 0x0409, 0x04B0
}

А вот это всё, что видит плагин. Т.е. попытка увидеть не одну пару - есть, ибо в названии
по аналогии с описанными выше блоками есть `0` суффикс. Т.е. типа первую пару плагин
получается вывел, ну а где же тогда вторая пара?
Code:

VarFileInfo
{
    Translation 0: 0x0409, 0x04B0
    Translation 1: 0x0419, 0x04B0
}

Вот почему вывод не такой? Ок, для сравнения открываем FileInfo. НО там нет вообще
такого же вывода. Есть подозрение, что за это должен был бы отвечать вывод типа вот
этого всё же существующего:
Quote:
Language : Английский (США) (0x409)
Character Set : 1200 (ANSI - Unicode (BMP of ISO 10646)) (0x4B0)
Ибо он-то есть.
НО! Так ну нет же всё же рядом второго! Т.е. нет вывода по логике вот такого:
Quote:
Language : Английский (США) (0x409)
Character Set : 1200 (ANSI - Unicode (BMP of ISO 10646)) (0x4B0)
Language : Русский(Россия) (0x419)
Character Set : 1200 (ANSI - Unicode (BMP of ISO 10646)) (0x4B0)

Тогда открываем для сравнения утилиту PEAnatomist:
Code:

  "VarFileInfo" {
    "Translation",   0x0409, 0x04B0, 0x0419, 0x04B0
  }

Т.е. она в состоянии найти была и увидеть эти две пары данных... Причем вывод идет так, как
это писано в справке M$! А выше вот "в два блока - один над другим" - это было как бы мои
предположения лишь: мол, а хотя бы разве не "так" надо бы выводить инфу? НО если верить
справке - нет. Надо именно как в этой утилите - подряд через запятые подряд.
Значит всё же это большой баг в вашем плагине (как и в FileInfo)?

Далее идет более сложный вопрос. По идее полностью он от вас не зависит. Но может просто
огромная практика разбора ресурсов поможет подсказать нам выход из положения...
Ибо, еще раз - помним же про то, что нам надо двуязычность этого ресурса? RU + EN.
Так вот, теперь открыв в Проводнике меню, вызвав оттуда Свойства и открыв вкладку Подробно
мы увидели, что Все строки на инглише.. Но как? В пункте "Язык" вроде как четко считывается:
"Английский (США), Русский (Россия)"! Т.е. на русской локали ОС мы должны были бы увидеть
и все строки на русском. Переключаем на Инглиш всю ОС - всё по прежнему на инглише.
Возвращаемся на Русский - но ничего не исправилось. Все строки по прежнему на инглише.

И тут под руку случайно попадается файл SpellCheck.dll
И на нем эта двуязычность работает!!!!! На Обеих локалях ОС - на русском и на английском.
Открываем в вашем плагине этот файл, чтобы проверить, что там и как...

А там аж три ресурса VERSIONINFO! ХОТЯ в справке от мелкомягких явно пишется что она одна на весь файл!
НО допустим.. Может что-то изменилось...
Но опять-таки смотрим на ту инфу, что показывает плагин. Видите опять про кодовую страницу?
ОПЯТЬ там почему-то лишь 0, ХОТЯ в блоке этой VERSIONINFO структуры явно указан UNICODE!
Code:

StringFileInfo
{
  StringTable 0 (0x0419, 0x04b0)
  {
    Comments: Юникод версия
    FileDescription: Проверка орфографии в AkelPad на базе Hunspell
    FileVersion: 1.3.0.5
    InternalName: SpellCheck.dll
    OriginalFilename: SpellCheck.dll
    ProductName: SpellCheck (x64)
    ProductVersion: 1.3.0.5
  }
}

VarFileInfo
{
    Translation 0: 0x0419, 0x04B0
}

Вот что мы явно видим: 0x04b0 = 1200 = UNICODE! Ну явно же ошибка вывода данных в плагине!
Так же читаем поле ИМЯ и его значение: "1049 (Русский (Россия))". И вопрос - а ГДЕ это можно было
менять? Мы же в начале показали, что ИМЯ в самом редакторе ресурсов задано как константная строка
"Узел версии"!
И более ничего подходящего под имя в официальном редакторе нет! Так откуда и как в SpellCheck.dll
смогли загнать это имя? ИЛИ же по другому спросим - а откуда плагин умудряется читать это значение?
Из какого поля и какой официальной структуры, описанной на уровне сайта мелкомягких:
https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource?

Ну и все же - как можно объяснить такой казус - как 3 структуры VERSIONINFO в одном файле?
Разве это нормально и часто встречается? Т.е. только так можно по аналогии и нам добавить
двуязычность вывода строк из структуры VERSIONINFO?
Мне думается, что вряд ли можно, ибо если открыть вкладку ИНФО вашего плагина на этом файле, то
к выводу подаются лишь строки для:
Quote:

Комментарии,"Юникод версия"
Описание файла,"Проверка орфографии в AkelPad на базе Hunspell"
Версия файла,1.3.0.5
Внутреннее имя,SpellCheck.dll
Исходное имя файла,SpellCheck.dll
Название продукта,"SpellCheck (x64)"
Версия продукта,1.3.0.5
Язык,"0x0419 (1049) (Русский (Россия))"
Кодовая страница,"0x04B0 (1200)"

И всё! Хоть и есть ТРИ структуры - плагин почему-то показывает данные лишь по одной! А вот если смотреть
наш файл, сделанный по справке от М$, то на этой вкладке корректно видны два суб-блока вида StringTable.
Внутри них видны корректные записи по аналогии с перечисленными выше.


Last edited by Destiny on Sat Oct 26, 2024 16:54; edited 3 times in total
Back to top
View user's profile Send private message
iteg



Joined: 01 Dec 2011
Posts: 90

Post (Separately) Posted: Thu Oct 17, 2024 16:10    Post subject: Reply with quote

Destiny
Спасибо за оставленное описание проблем.
Чтобы дальнейшее обсуждение было продуктивным, то пришлите мне проблемные файлы для анализа и в сообщении для каждого файла кратко опишите его проблему.
Back to top
View user's profile Send private message
BlackFox



Joined: 18 Dec 2004
Posts: 54
Location: Mayence

Post (Separately) Posted: Tue Oct 22, 2024 16:14    Post subject: Reply with quote

Destiny wrote:
откуда ВООБЩЕ возможна тут, на этом уровне представления данных, эта
информация о некоей кодовой странице? Она применяется к чему? Ко всему блоку???
к текущему блоку StringFileInfo - как интерпретировать его строковые значения.

Destiny wrote:
Кстати, а что такое этот Тип 16? Вроде тип в этой структуре согласно справке константа 1 - и означающая, что это блок
с VERSIONINFO. А у вас что тут подразумевается?

Нет, 1 - это не VersionInfo.
Это же ведь показывается во вкладке "ресурсы"? Вот это и есть тип ресурса, как и написано в имени свойства. https://learn.microsoft.com/en-us/windows/win32/menurc/resource-types
А 1 - это версия описания ресурса VERSION_INFO (из вашего же линка - Version-information resource identifier. This value must be 1).

Вообще вы так много написали, не просматривая бинарное представление получившегося ресурса?
Возьмите, к примеру, ешё и (бесплатный) ResourceHacker и посмотрите им, как ресурсы показываются и как это в Binary View выглядит.
Back to top
View user's profile Send private message
Destiny



Joined: 15 Dec 2015
Posts: 250

Post (Separately) Posted: Fri Oct 25, 2024 19:52    Post subject: Reply with quote

День добрый. https://www.upload.ee/files/17309611/usedFiles.rar.html
Вот ссылка на три упомянутых тут файла. А вот насчет краткой приписки к ним.
Ну как бы весь текст моего поста - это и есть краткий экскурс в проблему (((
Т.е. вот весь текст и надо анализировать, сравнивать с тем, что на месте вы увидите
в данных ЕХЕ/DLL файлах.

Единственно что еще дополню - это в SpellCheck.dll в разделах английских ресурсов версионности
почему-то указаны: StringTable 0 (0x0000, 0x04b0) и StringTable 1 (0x0009, 0x04b0)
Так вот если 0x04b0 - это 1200, Unicode в соответствии с данными из справки мелкомягких:
https://learn.microsoft.com/en-us/windows/win32/menurc/stringfileinfo-block
Так вот 0x0000 и/или уж тем более 0x0009 там в языковых вариантах не описаны.
И почему-то сборка DLL завершилась успешно, раз этот файл мы видим на диске.
НО эти же константы ни к какому из разрешенных языков не относятся!!!
КАК вдруг это трансформируется в Английский? Ведь судя по этому же справке первым
числом идет константа ЯЗЫКА! и лишь потом идёт уточнение кодовой страницы.
И тоже самое для блока https://learn.microsoft.com/en-us/windows/win32/menurc/varfileinfo-block
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0, 1200, 0x9, 1200
END
Тут же идёт повтор пар langID, charsetID. Вот и выходит, что в проекте SpellCheck умудряются
задать пары {0x0, 1200} и {0x9, 1200} для языков 0 и 9 - которых нет в справочниках....
НО и ваш плагин и другой и другая программа - все указывают на это как на английский.
Но это же не так... если верить справке.

И еще = это будет инглиш, если в установке ОС выставлен языком системы Английский! Иначе
будет выбираться ресурс версионности, доступный для русского или украинского - они три там
есть, как мы видим. А в них нет этой двойственности пар, кстати...
И тогда просто верный русский будет язык или украинский. И это понятно и логично.
И вот тока с инглишем - бардак.
Back to top
View user's profile Send private message
BlackFox



Joined: 18 Dec 2004
Posts: 54
Location: Mayence

Post (Separately) Posted: Mon Oct 28, 2024 12:08    Post subject: Reply with quote

Destiny
если при указании кодовой страницы используется 0 - то это т.н. CP_ACP, которая выставлена страницей по умолчанию в настройках Windows.
А если страница указана - то для корректного отображения строк язык в общем-то и не нужен, и, видимо, если этот язык в 0 выставить - берётся текущий язык системы.
Совпадает это предположение с вашими наблюдениями?
Кстати, выложите полный RC-файл с несколькими языками, я у себя локально попробую (а то что-то с наскока не компилируются 2 варианта для версии)
Back to top
View user's profile Send private message
Destiny



Joined: 15 Dec 2015
Posts: 250

Post (Separately) Posted: Tue Oct 29, 2024 18:55    Post subject: Reply with quote

Дык в том и проблема, которая вылилась в этот экскурс в историю парсинга полей структуры VERSIONINFO.
Наша попытка привела к созданию файла - да, он есть (присутствует в архиве выше), но не к поддержке рабочей двуязычности по факту.
Поэтому как бы ну и толку, что оно скомпилировалось? По факту же нельзя из-под русской винды увидеть русскую версию, а из-под
английской - английскую версионность и её поля....


Last edited by Destiny on Wed Oct 30, 2024 17:45; edited 1 time in total
Back to top
View user's profile Send private message
BlackFox



Joined: 18 Dec 2004
Posts: 54
Location: Mayence

Post (Separately) Posted: Wed Oct 30, 2024 12:19    Post subject: Reply with quote

Кстати, в отличие от FileInfo, который на нерусской кодстранице по умолчанию из руских букв делает знаки вопроса, peViewer показывает русскую часть VersionInfo корректно.
И в очередной раз помогает показание языков и кодстраниц в 10- и 16-ричных системах - спасибо автору!
Back to top
View user's profile Send private message
SUKER



Joined: 17 Dec 2004
Posts: 49
Location: Санкт-Петербург

Post (Separately) Posted: Mon Nov 04, 2024 16:48    Post subject: Reply with quote

iteg
Спасибо огромное за новую версию, в особенности за светлую тему Exclamation
Небольшой баг, в панели ресурсов в светлой теме, шрифт очень мелкий. Если переключить на тёмную тему - становится нормальным, переключаем обратно на светлую, так и остается нормальным.
Скрин (форум к сожалению не понимает данную ссылку в теге img):
https://lh3.googleusercontent.com/pw/AP1GczPZc76vD0PJtQfxBWRxhUqDS0LXtX5Kv4c0EkIB13s1pmbdWAH5RT44-7bomYho_Cym2r75-KFYId04ntgGKioSsCLiTGw0FLc4hKKSUMgTLiGVoQsPcWlBU-xXIsraxqHh18qF9_nt20u5PJDac9Al=w1402-h475-s-no-gm
Back to top
View user's profile Send private message
iteg



Joined: 01 Dec 2011
Posts: 90

Post (Separately) Posted: Tue Nov 05, 2024 16:42    Post subject: Reply with quote

1) Mrak_Tlen
Quote:
Вот бы была вкладка чисто с иконками, как iclview.wlx

Делать отдельную вкладку для иконок не планирую, т.к. это не соответствует концепции плагина. Но пометил себе в ToDo реализацию отображения иконок/курсоров в виде списка.
2) yozhik и SUKER
У вас одна и та же проблема. Исправил и выйдет в следующей версии.
Back to top
View user's profile Send private message
Destiny



Joined: 15 Dec 2015
Posts: 250

Post (Separately) Posted: Tue Nov 05, 2024 22:51    Post subject: Reply with quote

iteg
Ну как там с анализом описанной мной странной ситуации с выводом инфы о версиях?
Back to top
View user's profile Send private message
iteg



Joined: 01 Dec 2011
Posts: 90

Post (Separately) Posted: Thu Nov 07, 2024 01:08    Post subject: Reply with quote

Destiny
Не смог оперативно ответить, т.к. в процессе детального анализа описанных проблем (за которые вам благодарность!), потребовалось сделать несколько доработок, а также всё перепроверять.
1) Описание типов ресурсов добавил в их свойства. До 25 - стандартные, после 25 - мои собственные.
2) Доработал разбор записей структуры VarFileInfo. Ранее выводилась только одна пара Language и CodePage, теперь все, даже неполные.
3) Доработал функцию получения имени кодовой страницы. Теперь корректно обрабатывается значение 1200.
4) Значение кодовой странице 0 (CP_ACP) определяет, что кодовая страница будет получаться через WinAPI функцию GetACP - извлекает текущий идентификатор кодовой страницы Windows ANSI для операционной системы, по которому и получаю в ОС имя.
5) Каждый ресурс состоит из нескольких уровней и несет в своей структуре Lang и SubLang. Смотрите https://lief.re/doc/latest/tutorials/07_pe_resource.html.
Разберем на примере структуры VERSIONINFO. Согласно документации versionID должен быть равен '1'. Тогда для мультиязычности нам необходимо сделать несколько структур VERSIONINFO с единым идентификатором '1'.
Наглядный пример с другими вложенными ресурсами можно увидеть в mediacreationtool.exe (https://www.microsoft.com/en-us/software-download/windows11 и выбрать "Create Windows 11 Installation Media").
В плагине реализовано упрощение по глубине вложенности. Если ресурс имеет только один элемент "Level 3: Language", то в визуальное дерево переношу его как лист с именем идентификатора "Level 2: ID", т.е. '1'. Если элементов "Level 3: Language" несколько, то сохраняю оригинальную вложенность, т.е. элемент '1' ("Level 2: ID") будет узлом, в котором будут все элементы "Level 3: Language".
Также на вкладке "Инфо" выбор версионного ресурса происходит по алгоритму (т.к. версионных блоков может быть несколько десятков и пользователю необходимо предоставить только блок на его локали ОС, все остальные он может посмотреть на вкладке "Ресурсы"):
- находим directory с типом RT_VERSION.
- далее из неё получаем первую subdirectory, т.к. в документации идентификатор должен быть только один '1'.
- если в данной subdirectory несколько вхождений ресурсов, то шаг 1 - получаем идентификатор локализации свой ОС (GetUserDefaultLCID), если такого ресурса нет, то шаг 2 - ищем ресурс с '0 (Language Neutral)', если такого ресурса нет, то шаг 3 - берем самый первый ресурс.
Как раз на mediacreationtool.exe и переключении локали ОС в плагине на вкладке "Инфо" можно увидеть, что будет выбираться соответствующий версионный ресурс.
Данные изменения реализованы в тестовой сборке. По возможности протестируйте.

Тестовая версия 3.0.16.1:
- Устранена ошибка распаковки UPX. Если открыть исполняемый файл из архива, то totalcmd поместит его в "%TEMP%\_tc", которую также использует плагин для распаковки UPX. Чтобы не было коллизий с путями директорий для плагина установлена временная директория "%TEMP%\_tc\pv".
- Для компонента TMemo устранена ошибка установки мелкого размера шрифта для светлой темы.
- Для параметра UPXPath реализована поддержка переменных среды. Например, UPXPath=%COMMANDER_PATH%\Utils\upx\upx.exe.
- Доработан вывод структуры VarFileInfo с выводом всех пар "Language" и "Code Page".
- Расширен вывод структуры VS_FIXEDFILEINFO.
- Доработана функция вывода имени кодовой страницы. Корректно обрабатывается 1200.
https://www.upload.ee/files/17357210/PEViewer_3.0.16.1.rar.html
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 250
Location: Электросталь

Post (Separately) Posted: Thu Nov 07, 2024 01:31    Post subject: Reply with quote

iteg wrote:
Для компонента TMemo устранена ошибка

Да, теперь всё в порядке, размер шрифта не уменьшается. Спасибо!
_________________
Amo ergo sum
Back to top
View user's profile Send private message
Destiny



Joined: 15 Dec 2015
Posts: 250

Post (Separately) Posted: Wed Nov 20, 2024 19:05    Post subject: Reply with quote

iteg

OK, скачано, установлено, запущены тестовые программы.
Пробую пока что сообразно своим мыслям пройтись по заметкам, увидеть разницу и рассказать о своих
мыслях, вопросах, возможно опять всё ещё пожеланиях.
А уж с вас, если что, разгромное описание моей тупости, если таковая возникнет))) Ок?

Начнем явно с бага - на вкладке Ресурсы внизу дерева есть панель со столбцами "Свойство \ Значение"
Так вот нельзя изменить размер по высоте у этой панели. Очень хочется её раздвинуть выше... и в бок.
Чтобы полосы прокрутки не появлялись.

Так, теперь Имя. Ок, раз просто 1 это вроде как прямое указание на стандартный тип ресурса- пусть так и пишется.
Но Тип! сейчас пишется как "16 (16 (Version))". Ну как бы явно стоит укоротить до: "16 (Version)"
Равно как и для узла дерева ресурсов вместо "Version (1)" было б читабельней, имхо, писать "Version - 1", просто
чтобы скобочки не ассоциировались с тем же, что и уточнение типов - мол, это не кол-во элементов, а его тип или
же идентификатор просто. Так же это логичнее и для случай, когда ресурсов тип 1 несколько - тогда выводится еще
один узел дерева с иконкой "папка" и пишется "1 (2)", к примеру. Да, сейчас я прочитаю это как "ресурс типа 1, в
кол-ве 2 шт.". НО потом скорее всего буду читать, как "имя 1, подтип 2" - что неверно конечно же.

Для раздела VS_FIXEDFILEINFO походу добавился вывод поля File Date: 0x0000000000000000 (01.01.1601 3:00:00)
И да, я видел статьи, где писалось, что такое поле вроде как есть, хотя в современных справочных материалах его
вроде как и нет. Структура заканчивается на FILESUBTYPE типа того... НО если поле всё же есть - то знаете ли вы
а ЧЕМ тогда это поле можно заполнить официально? В редакторе Visual Studio набор этих полей для правки жестко
ограничен для обработки - и даты там нет. Как и в справке Структура заканчивается на FILESUBTYPE!
Руками вписывать в шаблон RC файла - тоже не понятно КАК...
Хотя там похоже вообще в край это редактор урезан. Даже для типа FILEOS нет перечисления ВСЕХ встроенных
вариантов допустимых его значений, что есть в справке.

Теперь еще раз вернемся к панели со столбцами "Свойство \ Значение". При выделении ресурса 1 то, что там я
вижу Имя, Тип, Размер, Смещение - это я понимаю. А вот данные про Язык и Кодовую страницу - нет, не понимаю.
Ведь из справок и глазками в редакторе RC-файла мы же четко поняли, что ВСЯ инфа о языке присутствует ЛИШЬ
внутри этого ресурса в полях секции "StringFileInfo" в заголовке BLOCK "lang-charset".
Так зачем выводить туда эту инфу, да еще и в умолчательно может и верном формате, но по логике - явно нет.
Так для файла из примеров, что я скинул: FontsListing.exe, я вижу, что указывается 0x409 (1033). А в скобочках
вижу Английский (США). А потом идет кодовая страница "0 - ANSI - кириллица". Shocked
Да, Вы расписали это как:
Quote:
"Значение кодовой странице 0 (CP_ACP) определяет, что кодовая страница будет получаться через WinAPI функцию
GetACP - извлекает текущий идентификатор кодовой страницы Windows ANSI для операционной системы, по которому
и получаю в ОС имя."

Но вот ведь нюанс - а пользователю разве в ЭТОМ месте важно знать КАК именно будет производиться считывание и/или
перевод числа в наименование конкретной кодовой страницы? Мне казалось, что для УЗЛА дерева ресурсов не может
существовать такого понятия вообще. Потому как этот тип ресурсов содержит КОНКРЕТНОЕ место: StringFileInfo - где и
будет указана/выведена эта информация в корректном формате. Для взятого файла это будут ДВЕ структуры! где раздельно
будет указано: "StringTable 0 (0x0409, 0x04B0)" и "StringTable 1 (0x0419, 0x04B0)". Т.е. будет указана инфа о ДВУХ блоках
кодов об языке и его кодовой странице! А не об одном да еще и в "0" формате, который многим по умолчанию будет не ясен.
ИМХО, мне кажется в этой панели эти два параметра должны быть убраны. А то и для Иконок вдруг появляются эти блоки,
и инфа о том, что не вяжется с графический примитивами...

Причем это касается и ситуации, когда корректно указаны ДВА типа ресурсов VERSIONINFO - каждый из которых содержит
ровно один субблок StringTable внутри StringFileInfo с соответствующей языковой парой. И вот тогда хорошо, что имя этого
языка уходит в имя самого ресурса с типом 1: "1033 (Английский (США))". Вот только тут пусть это и будет показано!
Потому как мы четко видим по указанию в субблоке языковой пары (0x0409, 0x04B0) - т.е. это Юникодная кодо-страница!
И именно это уточнение я бы вот и хотел ЧЕТКО увидеть как подтверждение тому, что всё было задано верно в ресурсах.
НО! сейчас в обсуждаемой панельке я увижу: "0x0000 (0) (ANSI - кириллица)" - что опять взорвёт мне мозг. К сожалению.

Кстати, мгновенное отступление: в контекстном меню для элементов этого поля есть пункт "Копировать значение".
НО когда мы зайдем в подпункты этого подменю - мы увидим раздельно "Свойство", раздельно ОПЯТЬ "Значение".
Т.е. как бы масломасляное. Предлагается "Копировать ячейку" выводить как заголовок этого подменю. Потому как
выше вы используете "Копировать строку".

Возвращаемся...

Так же логике идее об убирании из панельки инфы об языке и кодовой странице добавляет просмотр другого файла из
архива примеров что я высылал. AkelPad. В исходниках основного RC файла из его проекта прописано: BLOCK "04090000"
И вот тогда-то увидеть "0x0000 (0) (ANSI - кириллица)" - но ТОЛЬКО на первой вкладке "ИНФО" - будет вполне логично
и корректно. Но никак на вкладке "Ресурсы" в этой панельке для ВСЕГО узла дерева.

Ну и пример в виде файла SpellCheck.dll. Я вот там немного так и не понял насчет парсинга языковых пар, к примеру, хотя
бы вот тут:
VarFileInfo
{
Translation 0: 0x0000, 0x04B0, 0x0009, 0x04B0
}

Да, вы указываете корректно в имени узла ресурса "1033 (Английский (США))" для этого варианта ресурса. НО! мы же вроде точно
знаем, видим, что указаны там НЕВЕРНЫЕ коды! 0x0000 и 0x0009! Еще раз! Тут же указаны КОДЫ ЯЗЫКОВ! Не варианты кодовых
страниц, для них-то как раз всё указано предельно точно, а для четко варианты языков! Там вот НЕТ в таблицах языков 0 и 9!
ИМХО, эти кодовые пары надо было бы пометить как-то цветом, чтобы акцентировать внимание на явной ошибке процесса создания
RC-файла под этот продукт.

Ну и в общем спасибо за подсказку "Тогда для мультиязычности нам необходимо сделать несколько структур VERSIONINFO с единым
идентификатором '1'" - благодаря ей, получилось-таки сделать так, как хотелось. НО правда по прежнему висит сугубо уже теоретический,
но тем не менее вопрос - это как же они умудрились просрать справку, что по факту надо делать НЕ ТО, что там описано!?
Т.е. справка про мультиязычность описывается относительно субблоков StringTable внутри StringFileInfo с соответствующим языковым ID.
Вот их может быть сколько угодно - для каждого языка. А по факту нет - надо делать ВСЮ структуру VERSIONINFO повторяемой, причем
под спец дефайнами:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
....
#endif // Английский (США) resources

И каждая структура структуру VERSIONINFO долина быть заточена на ОДИН языковой субблок StringTable внутри StringFileInfo
с соответствующей парой языковых данных.


Last edited by Destiny on Thu Dec 05, 2024 17:20; edited 2 times in total
Back to top
View user's profile Send private message
iteg



Joined: 01 Dec 2011
Posts: 90

Post (Separately) Posted: Thu Nov 21, 2024 14:21    Post subject: Reply with quote

Тестовая версия 3.0.16.2:
- Для формы "Sections / Headers" реализован разбор заголовков MZ, NE, LE и ELF. Пока поддерживается ELF и ELF64 только Little-Endian.
- Для формы "Info" добавлено поле Entropy.
- Доработан вывод ресурса TYPELIB.
- Для формы "Info" реализовано копирование пути к файлу в буфер обмена при успешной UPX-распаковке. По аналогии как при открытии ссылки на VirusTotal.
- Для формы "Resources" реализовано копирование иконок и курсоров в буфер обмена.
- Для формы "Resources" для списка элементов добавлены колонки Language и CodePage.
https://www.upload.ee/files/17416672/PEViewer_3.0.16.2.rar.html
Back to top
View user's profile Send private message
Destiny



Joined: 15 Dec 2015
Posts: 250

Post (Separately) Posted: Thu Nov 21, 2024 19:50    Post subject: Reply with quote

Так, похоже мои описания еще не были прочитаны и проинтерпретированы)))
Или наоборот - были, но дали странный, с моей позиции, итоговый результат.

Та самая панелька, что я описывал как имеющую баг относительно раздвигания ее размеров по высоте - кажется
становится все менее полезной? Сейчас там ничего не выводится, чего бы не было в правой, табличной части
Значит убираем её?

Далее - насчет вывода в принципе языка и кодовой страницы в таблице.
еще раз - я вполне допускаю, что я чего-то совершенно не знаю/не учитываю в своих мыслях. НО! вот где и как
вдруг оказалось расписанным, что именования ресурсов - ВСЕ имена ресурсов - имеют какой-то язык и кодостраницу?
Сами ресурсы - вот это я ещё вполне способен понять - т.к. если брать за основу генерацию RC-файла средствами
Visual Studio - то все ресурсы по умолчанию оказываются в охранительных дефайнах вида:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
.... <тут идет список созданных ресурсов>
#endif // Английский (США) resources

или

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
.... <тут идет список созданных ресурсов>
#endif // Русский (Россия) resources

И это ок. Т.е. к примеру, возьмем ресурс "String Table" и для нашего файла из примеров: FontsListing.exe
В его исходном RC-файле указано под дефайном для РУССКОГО языка:
STRINGTABLE
BEGIN
IDS_APP_TITLE "FontsListing"
IDC_FONTSLISTING "FONTSLISTING"
END

Следовательно, вполне разумно сказать (и подумать), что в дереве ресурсов, что выводит ваш плагин,
должно быть имя ресурса "String Table" как имя узла дерева и в нем один элемент, в котором должно
быть возможным прочитать две записи вида:
"FontsListing"
"FONTSLISTING"

И что по факту? Узел есть: "String Table". В скобках у него указана 1 - т.е. есть один элемент. Пока всё
ровно так как мы и рассуждали. Раскрываю этот один узел и вижу элемент.... А откуда у него имя "7"?
Вообще у всех конечных элементов узлов с типами ресурсов откуда их числовые "имена"?
Насчет распределения чисел от 1 до 25 - это какой-то стандарт (кстати, можно ссылку?) - и эти числа
описывают численно ТИПЫ ресурсов, т.е. определяют пары "словесное описание ресурса" - "числовое".
1 - это курсор, 2 - это Bitmap, 3 - это Icon. К примеру... И для "String Table" это 6. Это тип. Это ясно.
НО имя-то числовое откуда? Ещё одна проблема/непонятка, окромя той, о которой хотелось написать...
Ээээх.
Итак, мы отошли от изначальной проблемы - это когда я выделяю мышкой УЗЕЛ дерева "String Table", то
в таблице справа я вдруг вижу, что язык у ресурса Инглиш, а кодостраница - аж вдруг ANSI кириллица....
Так вот ОТКУДА взялась эта инфа, если этот тип ресурсов в изначальном RC-файле строго под дефайном
для РУССКОГО языка расположен???

И это сочетание Инглиш-Кириллица для ВСЕХ узлов. ДЛЯ всех их элементов. Ну как так-то?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... , 10, 11, 12  Next
Page 11 of 12

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group