Автор Тема: Проблема с использованием нативной библиотеки из SDK в Unity3d  (Прочитано 4341 раз)

Derik

  • Пользователь
  • *****
  • Сообщений: 5
Здравствуйте. Использую конвертер Z-397 и контроллер для подключения СКУД к ПК. Для этого использую SDK Guard, а именно библиотеку ZGuard.dll и код из примеров, а именно из примера CtrEvents. Все это нужно, чтобы редактор Unity3d обрабатывал события, поступающие с контроллера и выводил их в некоторый лог сообщений (аналогично тому, как в примере происходит работа в консоли). Код соответственно интегрируется в скрипты Unity.
Библиотека и код были успешно перенесены. Но возникает проблема, при которой после завершения работы в Unity (то есть выключения сцены), она просто вылетает. Ну и соответственно никаких событий от контроллера получить тоже не удается. В последующем исследовании выяснилось, что выбрасывается Exception: Type Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid which is passed to unmanaged code must have a StructLayout attribute. Исключение выбрасывается в методе ToggleEventNotifyer() (аналогичный с методом в примере), а именно в этой строке:
if (m_oEvent == null)
                    m_oEvent = new ManualResetEvent(false);
                ZG_CTR_NOTIFY_SETTINGS rNS = new ZG_CTR_NOTIFY_SETTINGS(
                    ZGIntf.ZG_NF_CTR_NEW_EVENT, m_oEvent.SafeWaitHandle, IntPtr.Zero, 0,
                    m_nAppReadEventIdx, 300, 0); );

При этом программа корректно отрабатывает из примера в консоли, но при интеграции в Unity происходит вот такая проблема. При этом до этого успешно получилось перенести инициализацию библиотеки SDK, конвертера и контроллера. Unity их обнаруживал и уведомлял об этом.

gsa

  • Пользователь
  • *****
  • Сообщений: 265
Добрый день. Подозреваю, что код, в котором вызывается исключение, отличается от кода примера. Пришлите на email gsa@ironlogic.ru весь код, в котором возникает эта ошибка. Ещё пришлите, пожалуйста, лог ZGuard.log, для этого нужно подключить ZGuard.dll из папки "Log\" и первый раз вызвать функции с параметрами ZG_Initialize(ZP_IF_LOG | ZG_IF_LOG) и ZP_SetLog('', 'c:\zguard.log', 0xffffffff).

Derik

  • Пользователь
  • *****
  • Сообщений: 5
Добрый день. Подозреваю, что код, в котором вызывается исключение, отличается от кода примера. Пришлите на email gsa@ironlogic.ru весь код, в котором возникает эта ошибка. Ещё пришлите, пожалуйста, лог ZGuard.log, для этого нужно подключить ZGuard.dll из папки "Log\" и первый раз вызвать функции с параметрами ZG_Initialize(ZP_IF_LOG | ZG_IF_LOG) и ZP_SetLog('', 'c:\zguard.log', 0xffffffff).
Код уже сильно модифицирован, пришлось частично отказаться от данного примера. Ранее как и в примере нативная библиотека сама передавала произошедшие события. Теперь же было реализовано с помощью событий (event) так, чтобы программа сама обращалась с некоторой периодичностью к контроллеру через библиотеку и делала опрос новый событий. Так что проблема решена. Спасибо за обратную связь.
« Последнее редактирование: 09 Июня 2018, 12:05 от Derik »