AV при доступе к INTERFACE-типам из длл под вин7

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

AV при доступе к INTERFACE-типам из длл под вин7

Сообщение phomm » 01.10.2014 14:37:52

Доброго всем.

Есть проект. https://github.com/DGLE-HQ/DGLE
Игровой движок, написанный на с++, компилируется на vs2010 в длл, реализует интерфейсы (для межпроцессного взаимодействия идёт реализация СОМ), я сотрудничаю с автором по вопросам поддержки паскаля и дотнет-сборки.

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

В результате:
Демки, скомпиленые в дельфях бегают как по писанному (идентично оригиналам демок на с++ из комплекта движка) на любых виндах.
Демки, скомпиленные в фпц (и/или на лазаре, если вдруг имеет значение), на винХП бегают тоже идеально (проверялось на нескольких винхп).

Демки, скомпиленные в фпц на вин7, крешатся при первом обращении к полученному из дллки главному интерфейсу движка IEngineCore.

Сам движковый интерфейс получается из либы вроде как нормально (ошибки, сообщаемые виндой и самим движком мониторятся, везде успех), хотя не могу судить, в лазаре вотчесы не дают какой-то картины по интерфейсам (но надо уточнить, дебаг сессию под винхп в лазаре ещё не проводил, только дебажил под вин7).

Т.о. получаем внешне валидный интерфейс, пытаемся к нему обратиться (метод pEngineCore.InitializeEngine в демках) и AV, насколько я могу судить.

Подозрение на некорректный указатель метода в таблице методов интерфейса.
Были испробованы разные {$MODE } и разные {$INTERFACES } - резалта нет. Фрипаскаль 2.6.2 Лазарь 1.2.0
Почитал темы тут и по инету, пока ничего наводящего на мысли о решении (кроме уже испробованных) не нашёл.

Ваши предложения, господа ?

п.с. Тестировать запуская DPR-ки отсюда https://github.com/DGLE-HQ/DGLE/tree/ma ... les/delphi (хедеры https://github.com/DGLE-HQ/DGLE/tree/ma ... ude/delphi). Лучше скачать всё, т.к. используются медиа-ресурсы (хотя для демок с просто графическими ресурсами, например, Simplest достаточно только dpr и хедеров, отсутствующая графика заменяется на пустышку).
Под лазарем для них создавать простейший проект для консольного приложения.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение Sharfik » 01.10.2014 15:18:33

dll точно подгружается, не может быть такого что ты не подгрузил ее, а вместо интерфейса передается не инициализированная переменная?
Уточни 64 или 32 используешься fpc.
Я когда начал пробовать работать на lazarus с dll, то не смог в fpc 2.6.2 заставить подгружаться и работать их. Взял из тестовых сборок Lazarus-1.1 + fpc-2.7.1 32битный и теперь все на нем пишу.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 808
Зарегистрирован: 20.07.2013 01:04:30

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение phomm » 01.10.2014 21:04:49

Фрипас используется 32битный и винды все 32битные.

Что именно находится в переменной под интерфейс, мне неизвестно, возможно надо проверять через as или Supports и посмотреть что выведет на винхп и вин7, это мысль, попробую.
фпц 2.7 тоже надо попробовать, спасибо.

Если для кого много букаф в первопосте, то резюмирую:

Скомпиленные на разных дельфях экзешки запускаются и на вин7 и на винхп.
Скомпиленные на фпц экзешки запускаются только на винхп, а на вин7 крешатся.
Код естественно весь идентичный, ну если условную компиляцию, приводящую к немного различным бинарям от дельфи и от фпц, но не для разных виндов, не считать.

Добавлено спустя 12 часов 20 минут 35 секунд:
fpc-2.7.1 32битный попробовал, картина не изменилась.

Проверку Supports(pEngineCore , IEngineCore) и аналогичную с is сделал, выдаёт результат, который и ожидался, т.е. до попытки взять интерфейс из длл - FALSE (т.к. он ещё нил), после чего - TRUE, и понять влияние возможных коллизий указателей на картину креша пока мне не представляется возможным.

п.с. Для запуска примеров возможно потребуются минимальные подпилки, как-то выставить директорию поиска для хедеров, где-то может и компиль ругнётся (выверка кода ещё не идеальная, просто комментируйте строки, вряд ли они были важны, я бы иначе заметил давно), ещё заметил, что могут потребоваться скомпиленые библиотеки (в репозитории вряд ли есть билды, хотя они есть в релизе на гитхабе) - тащить вот отсюда, для удобства http://phomm.narod.ru/dgle_win32_bin.zip и положить в папку binwindows либо рядом с экзешником, но поправить путь поиска либы, константу в коде.

Добавлено спустя 2 часа 12 минут 6 секунд:
Для удобства теста собрал минимальный набор http://phomm.narod.ru/dgletest.zip
Компилим на дельфи - всё бегает, компилим на лазаре/фпц - на винхп бегает, на вин7 креш на обращении к pEngineCore.InitializeEngine (это следующая команда по коду после затягивания из длл ссылки на интерфейс).

Добавлено спустя 2 часа 7 минут 37 секунд:
Выяснились подробности. Проверил на 2 компах с вин7ультимейт - там запустилось нормально (правда на одном из них не была отрисована текстура, но это уже другое), а вот на моей вин7 проф креши, пробовал уже менять настройки компиляции такие как включение/отключение отладочной инфы, уровень оптимизации, пока никаких результатов. Возможно стоит попробовать более старый фпц - 2.4 допустим..

Однако в свете, вышеописанного, возможно, что глюк индивидуален, либо для каких-то факторов в винде вообще (которые у меня), или чисто от вин7проф или может вообще чисто от моего компа.
Посему просто прошу протестить и отписаться, для сомневающихся есть исходники в постах выше, для небрезгливых (в плане доверчивости к экзешникам из инета) могу запилить пакетик с 2 экзешками на строго идентичном коде - скомпиленых на дельфи и на фпц (можно даже разных версий
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение Vadim » 02.10.2014 15:05:51

phomm
Скачал Вашу последнюю ссылку с тестом. Скомпилировал, запустил. Сначала появилась лампочка, а потом окно с чёрным фоном и там бегает красная букашка. Так и должно быть?
Win7prof 32-ух разрядная (лицензионная ;-) ), fpc 2.6.4 32-ух разрядный.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение phomm » 02.10.2014 18:48:52

Да, сперва логотип движка, потом уже окно приложения, в нём должно быть чёрный фон, 2 строки разного цвета и картинка кружить по овальной траектории.
Я там малость накосячил когда архив собирал , видимо не так выделил и зацепил не файл с текстурой, а lpi , сейчас перезалил.

У меня винда тоже лицензионная :) видимо какие-то внутренние траблы (почему правда тогда из-под дельфи бегает нормально).

Если у кого-то будут всё же мысли куда что потыкать, буду рад услышать, а так, в принципе, получается , что от темы смысла нет, т.к. баг специфичный..
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение StarikPro » 02.10.2014 20:45:56

В своё время пытались к своей системе с плагинами прикрутить возможность разработки под fpc. При этом сразу оговорюсь что проблем реализации плагинов как на Delphi так и на C++ не возникало, основой взаимодействия которых были интерфейсные абстрактные класы. Скомпилированный шаблонный плагин на FPC работать отказался - падал при вызове методов абстрактного класса реализованного на делфи в другом плагине. Написал на багрепорт. Мне ответили что структуры методов реализаованного абстрактного класа м/у компиляторами несовместимы, для этого используйте интерфейсы (interface). Ради этого реализовал на интерфейсах, конечно с поддержкой старых вариантов, т.к. переделать все модули нереально - их уже более трёхсот. Плагины в новой интерпритации перкрасно заработали как из под Delphi так и C++, а FPC повёл как и в первом случае, т.е. - не помогло.
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение Vadim » 03.10.2014 06:40:50

phomm
Скачал ещё раз, перекомпилировал - в чёрном окне теперь вместо красной букашки бегает логотип, плюс две сроки разного цвета.
Наверное дефект специфический для Вашего компа. Попробуйте у себя на работе, к примеру, на разных компах протестировать, чтобы окончательно убедиться.
Кроме того, попробуйте у себя компилятор FPC поменять на версию 2.6.4, это последний стабильный.
В конфигурации компилятора у меня стоит режим компилирования по умолчанию - objfpc, проверьте у себя тоже.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение phomm » 06.10.2014 12:32:47

Всем спасибо.

Сегодня окончательно убедился, что баг локальный и вряд ли было возможно выявить, в чём он.
Очередной билд движка (перекомпилили дллку) привёл к норамальной работе, хотя так то и раньше пробовали на паре разных билдов.
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение phomm » 16.10.2014 09:06:11

Выяснилась одна подробность.
Билд движка (напомню: Dll на с++ , компиляемая в Visaul Studio) в DEBUG - и всё работает нормально, а в RELEASE - креш, именно так "исправился" баг, что имело место быть и в случае, описанном постом выше.

Может есть у кого желание тестануть оба этих случая ? Просто может какая-то инфа из тестов наведёт меня на мысль, куда бежать поправлять.
Тестовый архив http://phomm.narod.ru/dgletest2.zip
Для теста надо сперва из папки dbg скинуть в "корень" дллку и запустить прогу, потом из папки rls аналогично. По желанию исходники приложены - можно скомпилить как на дельфи так и на фрипасе.
Фидбек хочется в виде: какая винда (версия, битность, редакция), какая дельфи и/или фрипас, какая из дллок запустилась/не запустилась, какие были сообщения, коли не запустилась, использовали ли перекомпиляцию ( и с какими параметрами, хотя бы MODE, INTERFACES, DEBUG/RELEASE, оптимизация) и/или дебаггинг с исходниками и что дали эти манипуляции.

Спасибо )
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение Vapaamies » 17.10.2014 08:32:42

А вот у меня наоборот в Delphi 6: release-сборка библиотеки работает без проблем, а debug-версия выдает окно следующего содержания:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Assertion failed!

Program: X:DebugDGLE.dll
File: f:phdglerepdgledgleworksrcenginecore.cpp
Line: 414

Expression: eType == LT_INFO

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts

(Press Retry to debug the application - JIT must be enabled)
---------------------------
Прервать Повтор Пропустить
---------------------------

Потом, правда, сам тест работает -- окно появляется и точка движется. Windows XP 32 бита.

Добавлено спустя 4 минуты 59 секунд:
Обратил внимание, что в прологе модуля DGLE вызывается Set8087CW, чья реализация может различаться в Delphi и FPC. Непонятные ошибки на пустом месте в связке Паскаля и Си обычно из-за таких низкоуровневых вещей и бывают.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение phomm » 17.10.2014 15:00:22

Этот глюк нормален. Видимо некорректно пути навешались, картинка не находится (например, скомпили экзешник прямо в самой папке src и дллку туда кинули, а картинку нет, я для этих целей прикладывал dof и lpi указывающие выводить экзешку на каталог выше, может не срабтали они как я думал), и движок выдаёт дебаговый ассерт типа "инфо". А в релизе нет ассертов ессно.
Летать должна не точка (пустышка из движка для тестур), а картинка с лого движка.

Насчёт Set8087CW можно покопать, да, спасибо.
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: AV при доступе к INTERFACE-типам из длл под вин7

Сообщение Vapaamies » 17.10.2014 17:03:13

phomm писал(а):скомпили экзешник прямо в самой папке src и дллку туда кинули, а картинку нет

Да, именно так. У меня свои пути, поэтому чужие .dof не беру. Положил рядом картинку, стала двигаться картинка, ошибка с assertion в отладочной версии исчезла. Теперь, стало быть, всё работает без ошибок.

Добавлено спустя 1 минуту 2 секунды:
Даже перекомпилировать не пришлось. :mrgreen:
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru