Загрузка magic.dll из Wintermute Engine

Обсуждение специальной версии Magic Particles (Dev), предназначенной для разработчиков игр.

Загрузка magic.dll из Wintermute Engine

Сообщение Pipec » Пт июл 24, 2009 2:59 pm

Добрый день всем!
Есть такой движок - Wintermute Engine (dead-code.org). Пытаюсь к этому движку подключить magic.dll. Движок испльзует собственный язык скриптования который позволяет выполнять функции из внешних библиотек, но особенность в том, что библиотека загружается при вызове функции и сразу после завершения этой функции библиотека выгружается. Таким образом данные внутри библиотеки теряются. Разработчик движка рекомендует загружать библиотеку с помощью стандартной функции Win32 API - LoadLibrary. Когда я так делаю, то получаю ошибку 126 - ERROR_MOD_NOT_FOUND. Саму dll-ку уже ложил и в system32, и в папку движка, и в папку проекта - все время одно и тоже. Задавал абсолютный путь - та же история. Функция GetCurrentDirectory возвращает правильный путь к dll-ке, т.е. все должно работать.
Если у кого есть идеи какие, с радостью выслушаю.
Спасибо!
Pipec
 
Сообщения: 6
Зарегистрирован: Пт июл 24, 2009 2:46 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Odin_KG » Пт июл 24, 2009 4:19 pm

Я на всякий случай всё же проверил загрузку библиотеки через LoadLibrary - всё исправно загружается:
http://www.astralax.ru/hlam/LoadLibraryTest.rar
на всякий случай скачайте проект под VS 2005 и убедитесь (там есть exe-файл).

Больше пока у меня идей нет.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Pipec » Пн июл 27, 2009 12:09 pm

Спасибо!
Все оказалось намного прозаичней. Получил ответ от разработчика движка, он рекомендует не полагаться на значения, возвращаемые функцией GetLastError, поскольку движок сам использует API как хочет и это значение может не соответствовать действительности. Если LoadLibrary возвращает ненулевое значение, значит загрузка dll прошла удачно.
Pipec
 
Сообщения: 6
Зарегистрирован: Пт июл 24, 2009 2:46 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Odin_KG » Пн июл 27, 2009 2:53 pm

Если LoadLibrary возвращает ненулевое значение, значит загрузка dll прошла удачно.

До мне вдруг "дошла" ситуация :)
Вы проверяли GetLastError всегда, а это нужно делать только если LoadLibrary вернула 0. Т.е. если произошла ошибка, тогда и нужно смотреть на код ошибки, а иначе GetLastError вернет вам код ошибки, которая произошла когда-то давно.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Pipec » Пн июл 27, 2009 3:28 pm

Odin_KG писал(а):Вы проверяли GetLastError всегда, а это нужно делать только если LoadLibrary вернула 0.


Таки да! Даже в MSDN написано:

Return Value

If the function succeeds, the return value is a handle to the module.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Pipec
 
Сообщения: 6
Зарегистрирован: Пт июл 24, 2009 2:46 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Pipec » Пн июл 27, 2009 8:03 pm

Эх! Продолжим! ;)

Magic_OpenFile требует в качестве второго параметра использовать указатель на переменную, но в WME движке нет такого понятия, как указатель на переменную, но есть такой объект, как MemBuffer. Фактически это резервируется указанная область памяти указанного размера, доступ к которой осуществляется через указатель. Вот этот указатель и можно использовать как аргумент для Magic_OpenFile. Но самое интересное начинается потом - я должен собственноручно преобразовать то, что хранится в этом буфере в нужные мне данные. Я могу сделать 16 или 32 разрядное число, строку символов, число с плавающей точкой. По всей логике это должно быть 32-х разрядное число. Теперь, собственно вопрос - на что похож дескриптор, открытого в среде Magic Particles, файла? Потому что после всех вышеописанных манипуляций я получаю дескриптор равный 1. Но когда я закрываю файл, используя этот дескриптор в качестве аргумента для Magic_CloseFile, я получаю ошибку -2 MAGIC_ERROR.

Может это все немного сумбурно, спрошу кратко. Дескриптор, возвращаемый Magic_OpenFile 16 или 32-х разрядный и может ли этот дескриптор, чисто теоретически, быть равным 1?
Pipec
 
Сообщения: 6
Зарегистрирован: Пт июл 24, 2009 2:46 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Odin_KG » Пн июл 27, 2009 8:45 pm

Может это все немного сумбурно, спрошу кратко. Дескриптор, возвращаемый Magic_OpenFile 16 или 32-х разрядный и может ли этот дескриптор, чисто теоретически, быть равным 1?

Дескриптор - это номер элемента в массиве. Для первого загруженного файла он будет 1, для второго 2 и т.д. Представляет из себя 32-битное значение int.

Magic_CloseFile должен, конечно, закрывать файл. Но есть еще Magic_CloseAllFiles, которая закрывает все файлы сразу, эта функция вызывается автоматически перед завершение приложения. Если вы используете Враппер, то там сразу после загрузки все файлы закрываются через MP->CloseFiles();
Возможно вы пытаетесь закрыть уже закрытый файл.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Pipec » Пн июл 27, 2009 9:06 pm

Есть, работает! У меня была ошибка несоответствия типов
Pipec
 
Сообщения: 6
Зарегистрирован: Пт июл 24, 2009 2:46 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Pipec » Вс авг 02, 2009 10:20 am

И вот опять проблема... :(

В описании указано, что функция Magic_GetNextParticle(); возвращает либо указатель, либо null, но движок устроен таким образом, что отлавливать null нет возможности. Можно ли как-то еще определить, что Magic_GetNextParticle(); закончил перебор частиц.
Pipec
 
Сообщения: 6
Зарегистрирован: Пт июл 24, 2009 2:46 pm

Re: Загрузка magic.dll из Wintermute Engine

Сообщение Odin_KG » Вс авг 02, 2009 5:37 pm

Можно ли как-то еще определить, что Magic_GetNextParticle(); закончил перебор частиц.

я не знаю возможностей данного движка. что и как там сравнивается мне неизвестно. должен быть какой-то способ проверить в том виде, в котором это сейчас, иначе, кому нужно это подключение DLL, если невозможно с ней нормально работать? Никто же не будет писать DLL конкретно под данный движок, значит движок должен быть умнее.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm


Вернуться в Magic API

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

cron