<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Guardant &mdash; Лицензирование модульного приложения]]></title>
		<link>https://forum.guardant.ru/topic/1116/</link>
		<atom:link href="https://forum.guardant.ru/feed/rss/topic/1116/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Лицензирование модульного приложения».]]></description>
		<lastBuildDate>Tue, 09 Jun 2026 09:18:48 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5590/#p5590</link>
			<description><![CDATA[<div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>Спасибо!</p><p>Картинка начинает выкристаллизовываться...</p><p>Особенность в том, что модули должны работать ПАРАЛЛЕЛЬНО друг с другом в приложении. То есть пользователь активировал рисование кругов и не выключает его. Потом включил линии, а круги все так же остались.</p><p>На самом деле речь идет о расчетных модулях в сложной расчетной программе. Сложный проект, который создается в программе, может использовать сразу много расчетных модулей. Покупатель может приобретать разное число модулей, и мы должны проверять, что свободных модулей конкретных типов хватит для работы с конкретным расчетным проектом.</p><p>Насколько я понимаю, нам нужно сделать несколько логинов, работающих параллельно. Каждый логин будет соответствовать своему модулю. Как поступить в этом случае?</p><p>Можно ли так:</p><p>1. При запуске программы один раз делаем GrdStartup и GrdFind.<br />2. Тут же создаем новый хэндл и в нем делаем GrdLogin для нулевого модуля (базового, связанного с запуском самой программы). Если все лицензии нулевого модуля заняты, то выходим из программы.<br />3. При начале работы пользователя с каким-либо другим модулем (номер 1, 2 и т.д.) создаем новый хэндл с помощью GrdCreateHandle и логинимся в нем. Если все лицензии этого модуля заняты, то отказываем пользователю в использовании этого модуля, но продолжаем работу самой программы и других ранее подключенных модулей.<br />4. Если пользователь нажал на кнопку &quot;Отключить модуль N&quot;, то для этого модуля вызываем GrdCloseHandle, которая выполняет GrdLogout и высвобождает лицензию на этот модуль для других сетевых пользователей.<br />5. Если пользователь завершает работу программы, то для нулевого и всех оставшихся подключенных модулей вызываем GrdCloseHandle, а потом и GrdCleanup.</p><p>Будет работать?</p></blockquote></div><p>Да, в целом именно такая схема выглядит корректной для вашего сценария.</p>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Tue, 09 Jun 2026 09:18:48 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5590/#p5590</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5589/#p5589</link>
			<description><![CDATA[<p>Спасибо!</p><p>Картинка начинает выкристаллизовываться...</p><p>Особенность в том, что модули должны работать ПАРАЛЛЕЛЬНО друг с другом в приложении. То есть пользователь активировал рисование кругов и не выключает его. Потом включил линии, а круги все так же остались.</p><p>На самом деле речь идет о расчетных модулях в сложной расчетной программе. Сложный проект, который создается в программе, может использовать сразу много расчетных модулей. Покупатель может приобретать разное число модулей, и мы должны проверять, что свободных модулей конкретных типов хватит для работы с конкретным расчетным проектом.</p><p>Насколько я понимаю, нам нужно сделать несколько логинов, работающих параллельно. Каждый логин будет соответствовать своему модулю. Как поступить в этом случае?</p><p>Можно ли так:</p><p>1. При запуске программы один раз делаем GrdStartup и GrdFind.<br />2. Тут же создаем новый хэндл и в нем делаем GrdLogin для нулевого модуля (базового, связанного с запуском самой программы). Если все лицензии нулевого модуля заняты, то выходим из программы.<br />3. При начале работы пользователя с каким-либо другим модулем (номер 1, 2 и т.д.) создаем новый хэндл с помощью GrdCreateHandle и логинимся в нем. Если все лицензии этого модуля заняты, то отказываем пользователю в использовании этого модуля, но продолжаем работу самой программы и других ранее подключенных модулей.<br />4. Если пользователь нажал на кнопку &quot;Отключить модуль N&quot;, то для этого модуля вызываем GrdCloseHandle, которая выполняет GrdLogout и высвобождает лицензию на этот модуль для других сетевых пользователей.<br />5. Если пользователь завершает работу программы, то для нулевого и всех оставшихся подключенных модулей вызываем GrdCloseHandle, а потом и GrdCleanup.</p><p>Будет работать?</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Mon, 08 Jun 2026 13:04:54 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5589/#p5589</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5588/#p5588</link>
			<description><![CDATA[<p>Рекомендуем использовать следующий подход для одного приложения с несколькими функциональными модулями:</p><p>инициализацию Guardant API (GrdStartup) выполнять один раз при запуске приложения;<br />поиск ключа (GrdFind) также выполнять один раз после инициализации;<br />доступ к отдельным функциям приложения проверять отдельными вызовами GrdLogin для соответствующих номеров модулей;<br />завершение доступа выполнять отдельным вызовом GrdLogout для каждого успешного GrdLogin.<br />Необходимости повторно выполнять GrdStartup и GrdFind при переходе пользователя к работе с другим модулем в рамках того же exe-файла, как правило, нет.</p>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Mon, 08 Jun 2026 12:05:41 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5588/#p5588</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5587/#p5587</link>
			<description><![CDATA[<p>Добрый день!</p><p>Спасибо за информацию. И все-таки я не понял главного, о чем писал с самого начала. У меня НЕ несколько exe-файлов, а ОДИН. Единое приложение. В нем необходимо включать отдельные функциональные возможности (условно, кнопки с рисованием линий, кругов и т.д.). Вопрос о том, как это сделать с помощью API.</p><p>Можно ли при запуске программы сделать один вызов GrdStartup, затем найти ключ с помощью GrdFind, а потом несколько раз вызывать GrdLogin с различными номерами модулей? А после выхода из программы один раз сделать GrdLogout.<br />Или нужно при начале работы пользователя с модулем (в этом же exe-файле !!!) делать новый GrdStartup, опять искать ключ и логиниться в новом хендле с новым номером модуля?<br />Или вообще так делать нельзя?</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Mon, 08 Jun 2026 09:48:29 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5587/#p5587</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5586/#p5586</link>
			<description><![CDATA[<div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>В процессе работы с ключом каждый запуск GrdLogin создает новый сокет, а все остальные операции (шифрование и т.п.) проводится уже с установленным соединением?</p></blockquote></div><p>Да. После успешного вызова GrdLogin приложение получает доступ к операциям с ключом через открытый дескриптор grdHandle. Далее уже выполняются прочие операции (работа с аппаратными алгоритмами, защищенными ячейками и пр...).<br />То есть типовой сценарий такой: проверка/поиск ключа, выполнение Login, затем работа с доступными функциями ключа в рамках текущего открытого handle.</p><div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>Могут быть случаи, когда сервер ключей находится в другом городе.</p></blockquote></div><p>Работа с сетевыми ключами в первую очередь рассчитана на стабильное сетевое соединение, как правило — в пределах локальной сети.<br />Использование сетевого ключа в географически распределенной сети технически возможно, однако в таком сценарии стабильность работы защищенного приложения будет напрямую зависеть от качества и устойчивости канала связи между клиентом и сервером ключей.<br />Поэтому такой вариант использования не является рекомендуемым: при нестабильном соединении возможны сбои в работе приложения.</p>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Mon, 08 Jun 2026 08:58:27 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5586/#p5586</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5585/#p5585</link>
			<description><![CDATA[<div class="quotebox"><cite>Тимофей Ершов пишет:</cite><blockquote><p>Функция GrdLogout закрывает сразу все модули?</p></blockquote></div><p>Функция GrdLogout закрывает сеанс работы с локальным или удаленным ключом. Как правило, сеанс работы с ключом закрывается при завершении работы копии защищенного приложения, когда никакие более операции с данным ключом выполняться не будут. </p><p>Если сеанс был открыт с удаленным ключом, в процессе выполнения функции происходит возврат лицензии (увеличение на 1 счетчика лицензий) серверу Guardant Net и таблице лицензий LMS, с которыми работало приложение. </p><p>Вся информация об этой копии приложения в памяти сервера Guardant Net будет уничтожена. Возврат лицензии серверу осуществляется в том же режиме, что и производился захват. То есть учитывается режим выдачи лицензий рабочим станциям или копиям приложения. С этого момента получить доступ к ключу приложение может, только снова выполнив функцию GrdLogin.<br />Закрывается сессия по Handle<br /></p><div class="codebox"><pre><code>int GRD_API GrdLogout( 
  HANDLE hGrd,
  DWORD dwMode
); </code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Mon, 08 Jun 2026 08:46:53 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5585/#p5585</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5584/#p5584</link>
			<description><![CDATA[<p>Добрый день.<br /></p><div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>Теперь вопрос о том, как правильно использовать таблицу лицензий.</p><p>У нас программа поставляется по принципу: базис (запуск самой программы и минимального функционала) + модули. Допустим, пользователь купил 5 рабочих мест с базовым функционалом, 5 лицензий на модуль &quot;Линии&quot; и 2 лицензии на модуль &quot;Круги&quot;. Таким образом, одновременно 5 рабочих мест запускают программу и рисуют линии, а только 2 из них дополнительно рисуют круги. Правильно ли я понял, что таблица лицензий в этом случае имеет вид:<br />общий ресурс ключа - 5<br />модуль 0 (линии) - 5<br />модуль 1 (круги) - 2 ?</p><p>Или для базиса тоже нужно делать свой &quot;модуль&quot;?</p><p>Следующий вопрос, как активировать модули в программе. Я так понимаю, что при запуске самой программы (базиса) нужно выполнить GrdLogin с номером модуля 0xffffffff,&nbsp; а при активации модулей вызвать эту же функцию со значениями 0 и 1. Правильно?</p><p>И последнее. Функция GrdLogout закрывает сразу все модули? Если ли возможность освободить только один модуль, не закрывая программы? Например, чтобы пользователь рядом с модулем имел возможность нажать на кнопку &quot;Отключить&quot;. Или нужно закрыть все, а потом заново открыть все, кроме одного модуля?</p></blockquote></div><p>Описание:<br />Эта опция позволяет учитывать сетевой ресурс каждого модуля, входящего в многомодульное приложение.</p><p>Допустим, защищенный программный комплекс состоит из 4-х модулей: MyProg1.exe – Бухгалтерия, MyProg2.exe – Зарплата, MyProg3.exe – Кадры, MyProg4.exe – Канцелярия. </p><p>При помощи данной опции можно контролировать использование любого модуля. Для этого необходимо последовательно защитить каждый из модулей с опцией /MN=хх. Если будет использован номер, превышающий количество модулей в таблице лицензий, то при попытке регистрации приложения на сервере Guardant Net будет возвращен код ошибки 10 – Сетевой ресурс программы исчерпан (License counter of Guardant Net exhausted).</p><p>Важно!<br />Для использования системы управления лицензиями необходимо создать в памяти ключа специальное поле Таблица лицензий, в котором прописать количество модулей и ресурс лицензий каждого из них.</p><p>Защищенные в этом режиме приложения при запуске регистрируются на сервере Guardant Net и занимают определенный ресурс из таблицы лицензий.</p><p>Теперь конечный пользователь сможет запускать модули защищенного приложения только на определенном разработчиком количестве рабочих станций.</p><p>Номер модуля, который будет выбран для работы определяется параметром функции Login. Номер модуля в таблице LMS, на котором будет регистрироваться копия приложения. Если LMS не используется, параметр должен быть равен 0xFFFFFFFF. Для локальных ключей этот параметр игнорируется.</p>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Mon, 08 Jun 2026 08:32:33 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5584/#p5584</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5583/#p5583</link>
			<description><![CDATA[<p>Еще один технический вопрос.</p><p>В процессе работы с ключом каждый запуск GrdLogin создает новый сокет, а все остальные операции (шифрование и т.п.) проводится уже с установленным соединением? Или не так? Хотелось бы примерно понимать картину, чтобы оптимизировать запуск и использование сетевого ключа в отдельных модулях. Могут быть случаи, когда сервер ключей находится в другом городе. Короче, знать, что быстро, а что медленно.</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Fri, 05 Jun 2026 05:48:24 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5583/#p5583</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5582/#p5582</link>
			<description><![CDATA[<p>Теперь вопрос о том, как правильно использовать таблицу лицензий.</p><p>У нас программа поставляется по принципу: базис (запуск самой программы и минимального функционала) + модули. Допустим, пользователь купил 5 рабочих мест с базовым функционалом, 5 лицензий на модуль &quot;Линии&quot; и 2 лицензии на модуль &quot;Круги&quot;. Таким образом, одновременно 5 рабочих мест запускают программу и рисуют линии, а только 2 из них дополнительно рисуют круги. Правильно ли я понял, что таблица лицензий в этом случае имеет вид:<br />общий ресурс ключа - 5<br />модуль 0 (линии) - 5<br />модуль 1 (круги) - 2 ?</p><p>Или для базиса тоже нужно делать свой &quot;модуль&quot;?</p><p>Следующий вопрос, как активировать модули в программе. Я так понимаю, что при запуске самой программы (базиса) нужно выполнить GrdLogin с номером модуля 0xffffffff,&nbsp; а при активации модулей вызвать эту же функцию со значениями 0 и 1. Правильно?</p><p>И последнее. Функция GrdLogout закрывает сразу все модули? Если ли возможность освободить только один модуль, не закрывая программы? Например, чтобы пользователь рядом с модулем имел возможность нажать на кнопку &quot;Отключить&quot;. Или нужно закрыть все, а потом заново открыть все, кроме одного модуля?</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Thu, 04 Jun 2026 19:49:08 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5582/#p5582</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5581/#p5581</link>
			<description><![CDATA[<div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>Еще вопрос.<br />А можно ли с помощью API посмотреть число свободных модулей и кто их занял?</p></blockquote></div><p>В технологии Guardant SDK такой возможности нет.<br />Информация о количестве свободных лицензий и о том, кто их занял, доступна на стороне сервера сетевых лицензий, но не через API Guardant SDK.</p><p>В современной технологии лицензирования и защиты Guardant Station такая возможность уже реализована.</p><p>При этом обращаем внимание, что Guardant SDK и Guardant Station — это разные и несовместимые технологии. Поэтому при переходе на Guardant Station потребуется существенная переработка проекта защиты и его адаптация под новую технологию.</p>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Mon, 01 Jun 2026 07:32:47 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5581/#p5581</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5580/#p5580</link>
			<description><![CDATA[<p>Еще вопрос.<br />А можно ли с помощью API посмотреть число свободных модулей и кто их занял?</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Fri, 29 May 2026 07:49:30 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5580/#p5580</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5579/#p5579</link>
			<description><![CDATA[<div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>Хорошо.<br />А если пользователь загружает готовый файл, который использует сразу 50 модулей? Нужно будет их сразу проверить. Не будет лм сильно тормозить?</p></blockquote></div><p>Добрый день.<br />Ключ обрабатывает один запрос в единицу времени, то есть, в случае одновременного запуска всех модулей выстроится очередь из пятидесяти запросов. На обработку запроса уходит время, но исчисляется это время миллисекундами, так что ожидаем минимальную задержку в таком кейсе. Но более точную картину вы увидите при тестировании реального проекта.</p>]]></description>
			<author><![CDATA[null@example.com (Тимофей Ершов)]]></author>
			<pubDate>Wed, 27 May 2026 09:51:00 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5579/#p5579</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5578/#p5578</link>
			<description><![CDATA[<p>Хорошо.<br />А если пользователь загружает готовый файл, который использует сразу 50 модулей? Нужно будет их сразу проверить. Не будет лм сильно тормозить?</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Tue, 26 May 2026 09:55:37 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5578/#p5578</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5577/#p5577</link>
			<description><![CDATA[<p>Добрый день,</p><p>Да, можно использовать таблицу лицензий для такого приложения.</p><p>Рекомендуем рассмотреть такой вариант:</p><p>каждый модуль программы — отдельная запись в таблице лицензий;<br />для каждого модуля задается свое число лицензий;<br />например: “Линии” = 5, “Круги” = 1.</p><p>проверять и занимать лицензию при фактическом использовании модуля;<br />после завершения работы с модулем освобождать ее;</p><p>По производительности - замедление возможно только если слишком часто создавать/закрывать сессии и постоянно обращаться к ключу.</p>]]></description>
			<author><![CDATA[null@example.com (Александра Старчаус)]]></author>
			<pubDate>Fri, 22 May 2026 13:06:01 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5577/#p5577</guid>
		</item>
		<item>
			<title><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link>https://forum.guardant.ru/post/5576/#p5576</link>
			<description><![CDATA[<p>Версия GuardantSDK-7_0-update_8.msi</p>]]></description>
			<author><![CDATA[null@example.com (steevis)]]></author>
			<pubDate>Fri, 22 May 2026 03:45:24 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5576/#p5576</guid>
		</item>
	</channel>
</rss>
