Guardant API + Автозащита - Приложение закрывается по ошибке
Добрый вечер!
Столкнулся с такой проблемой:
Есть сервис защищенный автозащитой, в котором с периодичностью в 2 минуты опрашивается ключ используя Guardant API.
Спустя некоторое время, сервис завершает свою работу как раз в момент очередного опроса ключа.
Пытался варьировать время опроса в программе, время опроса автозашиты. Ничего не помогает.
Логика работы приложения:
в момент запуска сервиса выполняю
if (GrdStartup(GrdFMR_Local) <> GrdE_OK) then exit;
В теле процедуры периодического опроса ключа делаю следующее:
  try
    try
      dwPub :=  0;//ключи доступа
      dwPriv := 0;
      hnd := GrdCreateHandle(@abyGrd, GrdCHM_MultiThread, nil);
      if (hnd = nil) then exit;
      if (GrdSetFindMode(hnd, GrdFMR_Local, GrdFM_NProg, ProgNum, dwID, 0, 0, 0, 0, GrdFMM_ALL, GrdFMI_ALL)  <> GrdE_OK) then exit;
      nRet := GrdFind(hnd, GrdF_First, @dwID, @GrdFindInfo);
      if nRet <> GrdE_OK then exit;
      while (nRet = GrdE_OK) do begin
        idsLen := Length(id_list);
        SetLength(id_list, idsLen + 1);
        id_list[idsLen] := dwID;
        nRet := GrdFind(hnd, GrdF_Next, @dwID, @GrdFindInfo);
      end;
      if (nRet <> GrdE_AllDonglesFound) then exit;
      if (GrdSetAccessCodes(hnd, dwPub, dwPriv, 0, 0) <> GrdE_OK) then exit;
      for id in id_list do
      try
        if (GrdSetFindMode(hnd, GrdFMR_Local, GrdFM_ID, 0, id, 0, 0, 0, 0, GrdFMM_Sign, GrdFMI_USB) <> GrdE_OK) then exit;
        ZeroMemory(@buf, SizeOf(buf));
        if (GrdLogin(hnd, $FFFFFFFF, GrdLM_PerHandle) <> GrdE_OK) then exit;
        //блокировку ключа добавил с надеждой на решение проблемы
        if (GrdLock(hnd, 2000, 10000, GrdLM_All) <> GrdE_OK) then exit;
        if (GrdHashEx(hnd, 3, 32, @buf[0], GrdSC_All, 32, @buf[0], 0, nil, 32767, nil, nil) <> GrdE_OK) then exit;
        if (GrdPI_Read(hnd, 3, 0, 32, @ownerBuf[0], 0, nil) <> GrdE_OK) then exit;
        SetString(bs, ownerBuf, 32);
        bs := LowerCase(Trim(bs));
        tLen := Length(table);
        SetLength(table, tLen + 1);
        table[tLen].Owner := bs;
        for i := 4 to 15 do begin
          if (GrdHashEx(hnd, i, 32, @buf[0], GrdSC_All, 32, @buf[0], 0, nil, 32767, nil, nil) <> GrdE_OK) then
            continue;
          if (GrdPI_Read(hnd, i, 0, 32, @buf[0], 0, nil) = GrdE_OK) then begin
             // другой код...
          end;
        end;
        GrdUnlock(hnd);
        GrdLogout(hnd, GrdLM_PerHandle);
      except
        on E:Exception do begin
          WriteLog('Ошибка! При опросе ключа возникла ошибка: '+E.Message);
        end;
      end;
      Result := table;
    except
      on E:Exception do begin
        WriteLog('Ошибка! При опросе ключа возникла ошибка: '+E.Message);
      end;
    end;
  finally
    if (hnd <> nil) then
      GrdCloseHandle(hnd);
  end;В журнале Windows никаких подробностей нет. Просто "Служба неожиданно завершена...".
Ключ программирую вручную из своей программы.
Программу защищаю с такими параметрами:
/V /PACK /CPA /IMPLICIT_LINKING_SUPPORT /ATR=2 /UN=0x2A /USB_DONGLE_CONTROL /Q /IMPORT_HOOK=10:2 /T=5 /RIP_CODE=10 /SILENT
Подскажите, как решить проблему?

