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

Alexander Vasilyev

  • Пользователь
  • *****
  • Сообщений: 7
SDK, запись ключей
« : 02 Февраля 2018, 13:19 »
Добрый день!

Хочу спросить совета для функции ZG_Ctr_WriteKeys у разработчиков.
Имеем оборудование Z-397 Web и SDK ZGuard, версия 3.34.

Моя процедура записи ключей в контроллер использует -1 в качестве параметра nIdx:
Idx
[in] Номер первой карты, записываемой в контроллер. Если =-1, то используется значение верхней границы ключей (ZG_Ctr_GetKeyTopIndex).


        public void InsertKeys(string[] keys)
        {
            if (_hCtr == IntPtr.Zero)
            {
                throw new ApplicationException("Связь с турникетом не установлена. Попробуйте ваше действие позже.");
            }

            int nKeyIdx = -1;
            int hr;

            //hr = ZGIntf.ZG_Ctr_GetKeyTopIndex(_hCtr, ref nKeyIdx);
            //if (hr < 0)
            //{
            //    var msg = String.Format("Ошибка ZG_Ctr_GetKeyTopIndex ({0}).", hr);
            //    Trace.WriteLine(msg);

            //    throw new ApplicationException(msg);
            //}

            ZG_CTR_KEY[] aKeys = new ZG_CTR_KEY[keys.Length];
            for (int i = 0; i < keys.Length; i++)
            {
                aKeys[i].nType = ZG_CTR_KEY_TYPE.ZG_KEY_NORMAL;
                aKeys[i].nAccess = 0x01;
                //aKeys[i].nAccess = 0xff;
                aKeys[i].rNum = ZGIntf.StrToCardNum(keys[i]);
            }

            hr = ZGIntf.ZG_Ctr_WriteKeys(_hCtr, nKeyIdx, aKeys, aKeys.Length, null);
            if (hr < 0)
            {
                var msg = String.Format("Ошибка ZG_Ctr_WriteKeys ({0}).", hr);
                Trace.WriteLine(msg);

                throw new ApplicationException(msg);
            }
            else
                Trace.WriteLine(String.Format("InsertKeys в контроллер {1} успешно {0}.", String.Join(" - ",keys), Sn));
        }

Исходный код процедуры был взят из примеров в SDK, проект CtrKeys, файл Program, метод DoSetKey.
Моя проблема состоит в том, что следуя документации и передавая -1 в качестве параметра nIdx, функция выполняется с ошибкой:
E_INVALIDARG 80070057h Неправильные параметры. -2147024809
Помогите, пожалуйста, разобраться!
Расчёт был такой, что мне не понадобится предварительно вызывать ZG_Ctr_GetKeyTopIndex для получения параметра nIdx.

С уважением
« Последнее редактирование: 02 Февраля 2018, 17:27 от Alexander Vasilyev »

gsa

  • Пользователь
  • *****
  • Сообщений: 265
Re: SDK, запись ключей
« Ответ #1 : 07 Февраля 2018, 12:46 »
Добрый день

В документации ошибка, вместо "-1" надо использовать 0x7FFFFFFF.
Если ZG_Ctr_WriteKeys вызывается много раз в цикле, то ZG_Ctr_WriteKeys лучше устанавливать конкретный nIdx и устанавливать fUpdateTop=false, чтобы не замедлять запись ключей лишними запросами.