Автор Тема: Ошибка при запуске проекта FindControllers SDK v. 3.39.4  (Прочитано 3305 раз)

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Здравствуйте.
При запуске проекта FindControllers  из примеров кода на C# появляется ошибка:
"System.AccessViolationException: 'Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.'"
в методе "ZGIntf.ZG_Cvt_EnumControllers(m_hCvt, EnumCtrsCB, IntPtr.Zero)".
Из того, что делалось:
1) Поднял версию языка .Net 4 до .Net 4.8 иначе проект не загружался
2) Пробовал менять платформу и соответственно dll (x64/x86)

Если подставить в этот проект dll версии 3.20.ххх , то ошибка не возникает и все контроллеры находятся.
Подскажите, в чем может быть проблема?

gsa

  • Пользователь
  • *****
  • Сообщений: 276
Здравствуйте
3.39 и 3.20 не совместимы, просто подставить dll нельзя без перекомпиляции программы с заголовочным файлом такой же версии. Перед использованием функций dll нужно проверить версию: первые 2 числа в версии должны совпадать.
Какую dll используете (x86 из корневой папки установки, x64 из папки "x64")?
К какой модели конвертера подключаетесь?
На какой строке кода появляется ошибка?
Пришлите лог файл SDK "ZGuard.log", его пишет ZGuard.dll из папки "Log".
Попробовал запускать FindControllers (.NET Framework 4.8) в MSVS2022 с x86- и x64- вариантами ZGuard.dll (v3.39.4.1), подключался к Z-397 Web, 2 контроллера находит, ошибки не появляются.
Рекомендую использовать SDK Guard v4.0.

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Я закоментировал метод проверки версий в самом начале выполнения программы и конвертеры нашлись на версии 3.20.
Я пытался использовать и x64, и x86 - результат тот же.
Конвертер Z397-Guard версия прошивки 3.6.0.0
Ошибка появляется в 76 строке.
Файла логов не нашёшл почему-то.

gsa

  • Пользователь
  • *****
  • Сообщений: 276
Необходимо, чтобы версия dll и заголовочного файла были совместимы, иначе будет появляться такая ошибка.
С Z-397 Guard пример FindControllers (C#) также работает без ошибок у меня.

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Так я и говорю, что изначально они были в исходном состоянии. Это уже потом, в поисках решения проблемы, я начала экспериментировать с версиями dll.

gsa

  • Пользователь
  • *****
  • Сообщений: 276
Пришлите, пожалуйста, лог файл. Чтобы его записать нужно вызвать с флагами ZGIntf.ZG_Initialize(ZPIntf.ZP_IF_NO_MSG_LOOP | ZPIntf.ZP_IF_LOG | ZGIntf.ZG_IF_LOG), затем вызвать ZPIntf.ZP_SetLog("", "d:\\ZGuard.log", 0xffffffff) и в папку с *.exe копировать ZGuard.dll из папки "Log" или "Log\x64".
Проверьте совпадает ли "ZGuard.cs", "ZPort.cs" с оригинальными, которые создаются при чистой установке SDK.
Если временно выключить контроллеры, то ошибка исчезает?

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Кажется причина найдена. После чистой установки SDK  в классе ZPort указана версия SDK....1.20
class ZPIntf
    {
        #region Версия ZPort API
        public const int ZP_SDK_VER_MAJOR = 1;
        public const int ZP_SDK_VER_MINOR = 20;
        #endregion
...}
Соответственно в проекте не находится метод  ZPIntf.ZP_SetLog("", "d:\\ZGuard.log", 0xffffffff) и нет возможности записать логи)

у класса ZGIntf версия 3.39 при этом.
« Последнее редактирование: 17 Февраля 2025, 14:33 от Lummiense »

gsa

  • Пользователь
  • *****
  • Сообщений: 276
Если проблема решена, то лог файл не нужен. Метод ZP_SetLog обёрнут в #if ZP_LOG #endif, поэтому не находится, чтобы находился нужно либо убрать #if ZP_LOG #endif, либо в свойствах проекта > Сборка > в поле "Обозначения условной компиляции" добавить ZP_LOG.

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Ну причина, как я понимаю в несоответствии версии ZPIntf и версии SDK. Только что с этим делать?
Вот записанные логи:

Log 17.02.2025 (Windows 64-bit v6.2.9200 ; App 64-bit: ZPort.dll v1.20.1, \FindControllers.exe v1.0.0, ZGuard.dll v3.39.4)
15:24:37.354 [P I40022 3] Открыт порт "COM6". Handle=7E7980E0h, Скорость=230400, символ=0Dh, стоп-биты=0.
15:24:37.360 [P I40011 1] "ZP_Write" вернула 0h.  Handle=7E7980E0h, data=[3]{"i\r\n" 69 0D 0A}.
15:24:37.382 [P I40012 1] "ZP_Read" вернула 0h.  Handle=7E7980E0h, buf=[235/235]{"\r\nZ397-Guard converter S/N:1026760\r\nPulsar Ltd. +7(812)703-77-65, +7(495)787-70-66\r\nCopyright 2011 ironLogic\r\nhttp://www.ironlogic.ru\r\nVersion 3.6 build Apr 10 2023  18:12:22\r\n----------------------------------\r\nCurrent mode - Normal\r\n"}.
15:24:37.387 [P I40007 1] "ZP_SetBaudAndEvChar" вернула 0h.  Handle=7E7980E0h, baud=57600, char=FFFFFFF5h.
15:24:37.388 [G I45004 1] "ZG_Cvt_Open" вернула 0.  Handle=7E79A6C0h.

gsa

  • Пользователь
  • *****
  • Сообщений: 276
У Sdk Guard v3.39.4 должно быть:
  • ZGuard.cs с версией 3.39
  • ZPort.cs с версией 1.20
  • ZGuard.dll с версией 3.39
  • ZPort.dll с версией 1.20 (только если dll взяты из папки Split)
Лог файл получился короче, чем должен быть.
Пришлите исходник тестовой программы, включая ZGuard.cs, ZPort.cs и её файлы exe и dll (лучше ссылку на файл в облаке, почта exe не пропустит).
Ошибка появляется при каждом запуске программы?
Если временно выключить контроллеры, то ошибка исчезает?
« Последнее редактирование: 17 Февраля 2025, 16:18 от gsa »

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
У Sdk Guard v3.39.4 должно быть:
  • ZGuard.cs с версией 3.39
  • ZPort.cs с версией 1.20
  • ZGuard.dll с версией 3.39
  • ZPort.dll с версией 1.20 (только если dll взяты из папки Split)
Лог файл получился короче, чем должен быть.
Пришлите исходник тестовой программы, включая ZGuard.cs, ZPort.cs и её файлы exe и dll (лучше ссылку на файл в облаке, почта exe не пропустит).
Ошибка появляется при каждом запуске программы?
Если временно выключить контроллеры, то ошибка исчезает?
Как я уже говорил - это исходная версия с примерами, которая идет с SDK, взятая с официального сайта. Но на всякий случай ссылка на архив с решением:
https://disk.yandex.ru/d/4c7EHQq2RWEUtA

gsa

  • Пользователь
  • *****
  • Сообщений: 276
Пробовал несколько раз запускать пример "CSharp\Examples\FindControllers\bin\x64\Debug\FindControllers.exe" из CSharp.rar на Windows 10 - ошибки не появляются. Заметил, что в папке с exe отсутствуют msvcp100.dll и msvcr100.dll, они требуются для ZGuard.dll, возможно используются из системной папки. Попробуйте копировать эти файлы в папку с exe из папки "x64".

Ошибка появляется при каждом запуске программы?
Если временно выключить контроллеры, то ошибка исчезает?

Вы писали, что ошибка возникает на 76 строке, но там "Console.WriteLine("Найдено {0} контроллеров.", g_nCtrCount);", это точно?
Если закомментировать строку 222 "EnableNotification(true, false);", то ошибка всё равно воспроизводится?

Если запустить тот же пример, но на Visual C++, ошибка проявится? А в Demo ошибка проявляется?
« Последнее редактирование: 17 Февраля 2025, 19:09 от gsa »

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Хмм...интересненько. Пробовал закидывать msvcp100.dll и msvcr100.dll в папку с ехе и не помогло.
Да, ошибка появляется при каждом запуске. Ошибка возникает на 66 строке в момент вызова метода поиска контроллеров:
 hr = ZGIntf.ZG_Cvt_EnumControllers(m_hCvt, EnumCtrsCB, IntPtr.Zero);

При этом демка работает. Очень странно. Ладно, попробую потестировать без контроллеров и на другом компьютере. По результатам отпишу. Спасибо)

gsa

  • Пользователь
  • *****
  • Сообщений: 276
Оказалось, что ошибка проявляется только с конвертером в режиме Normal, а у меня было Advanced. Вот исправленный SDK Guard v3.39.5 https://disk.yandex.ru/d/kFU9EvZTGtBzRw
Если в примере "FindControllers" поменять местами строки 221 "DoGuardFindCtrs()" и 222 "EnableNotification(true, false)", то ошибка должна пропасть и без обновления SDK.

Lummiense

  • Пользователь
  • *****
  • Сообщений: 8
Да, заработало. Помогла замена парядка вызова методов. Спасибо большое за помощь!