А UnionAPI.dll не должна сидеть в Autorun - у Патрикса на гитхабе указано, что она должна сидеть в System, там она у меня и сидит.
Unionapi.dll актуальный будет сразу в систем лежать. А авторан его лучше вообще не класть, там способ загрузки разные и он всегда загружается вроде, что не надо.
Парни, разрешите немного подушить?) Я сейчас буду делать то, за что меня не любят на работе мои коллеги:
Разберем каким образом вся эта муть работает, чтобы выстроилось правильное понимание:
Ядро Union (Shw32.dll) распаковывает .dll из /Autorun vdf-тома на диск в Data\$Templates$\ и загружает их оттуда.
То есть, если UnionAPI.dll лежит в /Autorun vdf-тома, то Union распаковывает его в Data\$Templates$\ и
после этого UnionAPI.dll — настоящий файл на диске и/или уже загруженный модуль, так что импорт плагина разрешается.
Если в /Autorun vdf-тома его нет, а лежит он в /System vdf-тома, то Union его не распаковывает и он остаётся внутри vdf-тома, Windows на диске физически его не находит, и плагин падает с "0x00000006, Неверный дескриптор"
Но почему тогда плагин работает, если положить UnionAPI.dll в /system самой игры?
Вопрос интересный и он связан с спецификой работы Винды:
.dll загружает загрузчик Windows (LoadLibrary).
VDF он не видит, для него существуют только настоящие файлы на диске. Когда загружается .dll плагина, Windows ищет её зависимость UnionAPI.dll по обычному порядку поиска:
- Модуль с таким именем уже загружен в процесс? Тогда берётся он, по имени.
- Папка в которой находится exe. У Gothic это <игра>\System\, где лежит Gothic2.exe.
- System32, папка Windows. (SysWOW64 для 32-битных программ)
То есть из /system игры все читается не потому, что такова архитектура Union, а только благодаря гибкости Windows.
Если, допустим, я ложу UnionAPI.dll в Windows\SysWOW64 и у меня все работает, значит ли это что надо теперь всем говорить, что правильно ложить UnionAPI.dll в Windows\SysWOW64?) Почему бы и нет, работает ведь.
А наш знаменитый "Патрикс на гитхабе", который рекомендовал, что "она должна сидеть в System" уже год не может починить свой
GFA-фриаим.
Сорян, за духоту..