Падение программы на вызове GrdUnInitializeNotificationAPI

Здравствуйте! В нашем приложении используются ключи GuardantCodeTime. Примерная функция проверки лицензии выглядит следующим образом:

HANDLE hHandle = INVALID_HANDLE_VALUE;

int CheckLicense()
{ 
    // Результат работы функции
    int res = -1;
    
    // Наличие ключа
    bool keyOk = false;

    // Проверка наличия ключа
    if(hHandle == INVALID_HANDLE_VALUE || GrdCheck(hHandle) != GrdE_OK)
    {
        // Поиск и подключение к ключу
        if((GrdStartup() == GrdE_OK) &&
           (GrdCreateHandle(hHandle) != INVALID_HANDLE_VALUE) &&
           (GrdSetAccessCodes(hHandle, ...) == GrdE_OK) &&
           (GrdFind(hHandle, ...) == GrdE_OK) &&
           (GrdSetWorkMode(hHandle, ...) == GrdE_OK) &&
           (GrdLogin(hHandle) == GrdE_OK))
        {
            keyOk = true;
        // Возникли ошибки при подключению к ключу
        } else {
            GrdCloseHandle(hHandle);
            hHandle = INVALID_HANDLE_VALUE;
            GrdCleanup();
        }
    } else {
        // Ключ присутствует и уже был проинициализирован
        keyOk = true;
    }
    
    if(keyOk)
    {
        // Вызов внутренних функций ключа для проверки лицензии
        res = GrdCodeRun(...) 
        ...
    }
    
    return res;
}

Когда ключ подключен, функция проверки отрабатывает без ошибок, но когда ключа нет, то после 3-4 часов работы функции, возникает исключение SIGSEGV. Последняя успешно выполненная функция, которая отображается в отладчике - GrdUnInitializeNotificationAPI. Как я понимаю данная функция реализована в библиотеке GrdAPI.
   При отсутствии ключа выполняется следующий набор функций GrdStartup, GrdCreateHandle, GrdSetAccessCodes и на функции GrdFind происходит ошибка, из-за которой происходит вызов функций GrdCloseHandle, GrdCleanup. Еще хотелось бы отметить, что при подключенном ключе функция проверки вызывается раз в несколько минут, а при отсутсвии раз в 5 секунд. В чем может быть проблема?

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Здравствуйте. Уточните, какая версия SDK используется. В составе современного SDK присутствуют примеры использования Guardant API. Ознакомьтесь с примером General Guardant API. Здесь вы найдете рекомендации по реализации процедуры поиска и проверке наличия ключа.

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Здравствуйте Тимофей у нас используется SDK версии 7.
Примеры я практически все пересмотрел, они достаточно однотипны, работа с ключем происходит в одной функции и программа завершается.
А вот примеров как работать с ключом циклично я не нашел. Циклично это значит что в основной программе есть функция которая периодически проверяет подключен ли ключ и если он подключен
производит какие либо манипуляции с ним. Вы можете уточнить во время вызова какой функции Guardant API, выполняется функция GrdUnInitializeNotificationAPI во внутреннем коде библиотеки? И почему после ее вызова может произойти падение с сигналом SIGSEGV?

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Здравствуйте. Скачайте Guardant SDK 7 update 6. Соберетие ваше приложение, используя библиотеки и объектные файлы строго из SDK 7 up. 6. Проверьте работу приложения.

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Добрый день! У нас похожая проблема. Только ключ удаленный, при отключении локального компьютера от сети GrdCheck возвращает ошибку (конкретно, GrdE_NetConnectionLost), далее мы удаляем объект CGrdDongle, в деструкторе вызывается ::GrdCloseHandle(m_hGrd), на ней происходит вылет. Последняя функция в стеке вызовов GrdUnInitializeNotificationAPI (кроме этого в стеке видно вызов GrdLogout, перед ней GrdUnInitializeNotificationAPI и после нее еще 3).
Библиотеки взяты из Guardant SDK 7 update 6.
Есть скриншот, но не удалось загрузить на форум.

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

ls пишет:

Добрый день! У нас похожая проблема. Только ключ удаленный, при отключении локального компьютера от сети GrdCheck возвращает ошибку (конкретно, GrdE_NetConnectionLost), далее мы удаляем объект CGrdDongle, в деструкторе вызывается ::GrdCloseHandle(m_hGrd), на ней происходит вылет. Последняя функция в стеке вызовов GrdUnInitializeNotificationAPI (кроме этого в стеке видно вызов GrdLogout, перед ней GrdUnInitializeNotificationAPI и после нее еще 3).
Библиотеки взяты из Guardant SDK 7 update 6.
Есть скриншот, но не удалось загрузить на форум.

Добрый день. Приносим извинения за длительное ожидание ответа.
Необходимо проанализировать сетевое notification api. Мы передали информацию в наш отдел разработки. Если используется класс CGrdDongle, то в его конструкторе использование этого api можно выключить.

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Здравствуйте, спасибо! Выключение notification api в конструкторе помогло.

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Выяснил причину падения описанного в первом посте, она заключается в утечке памяти при вызове функции GrdCreateHandle(), когда в качестве первого параметра передается NULL. По факту функция GrdCloseHandle() не отчищает выделенную память защищенного контейнера. Ошибку удалось устранить передавая в качестве первого параметра в функцию GrdCreateHandle() не NULL, а заранее выделенный буфер данных типа BYTE размером GrdContainerSize.

Re: Падение программы на вызове GrdUnInitializeNotificationAPI

Coxwain пишет:

Выяснил причину падения описанного в первом посте, она заключается в утечке памяти при вызове функции GrdCreateHandle(), когда в качестве первого параметра передается NULL. По факту функция GrdCloseHandle() не отчищает выделенную память защищенного контейнера. Ошибку удалось устранить передавая в качестве первого параметра в функцию GrdCreateHandle() не NULL, а заранее выделенный буфер данных типа BYTE размером GrdContainerSize.

Проверили у себя с SDK 7 Update 6 — утечки нет.
При тестировании вы точно собирали приложение с API из SDK 7 Update 6?
Или подключались библиотеки\объекнтые файлы из предыдущих версий?