@Linda-chan

Linda-chan

Линда Кайе
Linda-chan

Дата рождения: 01.11.1983

Тотальная неудачница и убийца жёстких дисков. Самая большая поклонница Ариэль. Член ордена Вселенского тормоза имени Осаки-сан. Любительница каваййных переднеприводных машинок. Суккуб на полставки. Когти прилагаются.

https://www.lindachan.net

10 я читаю 59 меня читают
15084 постов
25813 комментариев
Linda-chan
30 Sep 2021

Пока мы ломали копья вокруг FreeBasic и FASM, случилась X Y проблема.

Как оно было? Моя библиотека (которую используют почти все мои программы, написанные на VB6) содержала пару функций для записи сообщений в журнал Windows, так же она содержала ресурс с шаблоном сообщения, который использует системный просмотрщик событий, ну и прописывалась источником этих самых шаблонов (источник событий). В Windows NT4/2000/XP всё работало офигенно: события пишутся, выводятся, замечательно. В x64 Windows 7 выяснилось, что просмотрщик не видит шаблона. Запись в реестре есть, файл есть, шаблонов нет.

«Разные разрядности!» – решила я и даже как-то не подумала посмотреть, что там с другими истониками. Тоесть x64 система почему-то не видит ресурсов в x86 DLL.

Однажды у меня дошли руки до сооружения отдельной DLL с ресурсом для x86 систем и отдельной – для x64 систем. Тоесть при установке программы копируем нужный файлик, и система его радостно использует. Исходную библиотеку я пишу на FreeBasic (предыдущая версия была вообще на VC++ 6), ну и эти ресурсные я решила запилить на FreeBasic.

Тут же появилось две проблемы. Во-первых тяжёлый фрибишный рантайм, впиливающийся в код библиотеки (у VB рантайм, например, хранится в легендарном MSVBVM60.DLL). Оказалось, что чтобы его искоренить, нужно всю компиляцию делать руками и городить костыли. А во-вторых, компиляторы, поставляемые с FreeBasic работают по принципу «Делаю бинарник только своей разрядности». Тоесть x86 бинарник делается x86 версией компилятора, x64 – x64 версией компилятора, а под линупс (if any) вообще под линупсом надо собирать. А я на XP :}

И тут вспомнился, собственно, FASM, который по своей природе не содержит рантаймов (ассемблер же) и собирает где угодно какой угодно бинарник (ассемблер же). Им я и сделала нормальные ресурные DLL.

А потом я задумалась, как их устанавливать. В реестре, в записи источника событий не указывается отдельно разрядность. Но что если просмотрщик будет не той же разрядности, что и система? Начала экспериментировать на x64 системе.

И тут я сделала два важных открытия. Во-первых, источник событий для моих программ прописывался без пути, просто именем файла. А во-вторых, он лежал в SysWOW64, поскольку x86. Иными словами, просмотрщик не то что не мог загрузить ресурс, он тупо не находил файл там, где ожидал его увидеть – в System32. Когда я прописала абсолютный путь, все события сразу же начали показываться нормально и с x86 DLL. А когда я посмотрела, как событие VB6 рантайма прописано по соседству, то нашла там запись в духе «C:\Windows\SysWOW64\msvbvm60.dll».

Всё это время я решала не ту задачу. Настоящим решением должно стать прописывание полного пути к DLL для новой библиотеки (при установке программы, которая её использует) и создание симлинка в System32 для старой (там код я поправить уже не могу).

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.