<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Guardant &mdash; Лицензирование модульного приложения]]></title>
	<link rel="self" href="https://forum.guardant.ru/feed/atom/topic/1116/" />
	<updated>2026-06-09T09:18:48Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.guardant.ru/topic/1116/</id>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5590/#p5590" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-06-09T09:18:48Z</updated>
			<id>https://forum.guardant.ru/post/5590/#p5590</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5589/#p5589" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-06-08T13:04:54Z</updated>
			<id>https://forum.guardant.ru/post/5589/#p5589</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5588/#p5588" />
			<content type="html"><![CDATA[<p>Рекомендуем использовать следующий подход для одного приложения с несколькими функциональными модулями:</p><p>инициализацию Guardant API (GrdStartup) выполнять один раз при запуске приложения;<br />поиск ключа (GrdFind) также выполнять один раз после инициализации;<br />доступ к отдельным функциям приложения проверять отдельными вызовами GrdLogin для соответствующих номеров модулей;<br />завершение доступа выполнять отдельным вызовом GrdLogout для каждого успешного GrdLogin.<br />Необходимости повторно выполнять GrdStartup и GrdFind при переходе пользователя к работе с другим модулем в рамках того же exe-файла, как правило, нет.</p>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-06-08T12:05:41Z</updated>
			<id>https://forum.guardant.ru/post/5588/#p5588</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5587/#p5587" />
			<content type="html"><![CDATA[<p>Добрый день!</p><p>Спасибо за информацию. И все-таки я не понял главного, о чем писал с самого начала. У меня НЕ несколько exe-файлов, а ОДИН. Единое приложение. В нем необходимо включать отдельные функциональные возможности (условно, кнопки с рисованием линий, кругов и т.д.). Вопрос о том, как это сделать с помощью API.</p><p>Можно ли при запуске программы сделать один вызов GrdStartup, затем найти ключ с помощью GrdFind, а потом несколько раз вызывать GrdLogin с различными номерами модулей? А после выхода из программы один раз сделать GrdLogout.<br />Или нужно при начале работы пользователя с модулем (в этом же exe-файле !!!) делать новый GrdStartup, опять искать ключ и логиниться в новом хендле с новым номером модуля?<br />Или вообще так делать нельзя?</p>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-06-08T09:48:29Z</updated>
			<id>https://forum.guardant.ru/post/5587/#p5587</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5586/#p5586" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-06-08T08:58:27Z</updated>
			<id>https://forum.guardant.ru/post/5586/#p5586</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5585/#p5585" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-06-08T08:46:53Z</updated>
			<id>https://forum.guardant.ru/post/5585/#p5585</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5584/#p5584" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-06-08T08:32:33Z</updated>
			<id>https://forum.guardant.ru/post/5584/#p5584</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5583/#p5583" />
			<content type="html"><![CDATA[<p>Еще один технический вопрос.</p><p>В процессе работы с ключом каждый запуск GrdLogin создает новый сокет, а все остальные операции (шифрование и т.п.) проводится уже с установленным соединением? Или не так? Хотелось бы примерно понимать картину, чтобы оптимизировать запуск и использование сетевого ключа в отдельных модулях. Могут быть случаи, когда сервер ключей находится в другом городе. Короче, знать, что быстро, а что медленно.</p>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-06-05T05:48:24Z</updated>
			<id>https://forum.guardant.ru/post/5583/#p5583</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5582/#p5582" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-06-04T19:49:08Z</updated>
			<id>https://forum.guardant.ru/post/5582/#p5582</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5581/#p5581" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-06-01T07:32:47Z</updated>
			<id>https://forum.guardant.ru/post/5581/#p5581</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5580/#p5580" />
			<content type="html"><![CDATA[<p>Еще вопрос.<br />А можно ли с помощью API посмотреть число свободных модулей и кто их занял?</p>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-05-29T07:49:30Z</updated>
			<id>https://forum.guardant.ru/post/5580/#p5580</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5579/#p5579" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>steevis пишет:</cite><blockquote><p>Хорошо.<br />А если пользователь загружает готовый файл, который использует сразу 50 модулей? Нужно будет их сразу проверить. Не будет лм сильно тормозить?</p></blockquote></div><p>Добрый день.<br />Ключ обрабатывает один запрос в единицу времени, то есть, в случае одновременного запуска всех модулей выстроится очередь из пятидесяти запросов. На обработку запроса уходит время, но исчисляется это время миллисекундами, так что ожидаем минимальную задержку в таком кейсе. Но более точную картину вы увидите при тестировании реального проекта.</p>]]></content>
			<author>
				<name><![CDATA[Тимофей Ершов]]></name>
				<uri>https://forum.guardant.ru/user/1116/</uri>
			</author>
			<updated>2026-05-27T09:51:00Z</updated>
			<id>https://forum.guardant.ru/post/5579/#p5579</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5578/#p5578" />
			<content type="html"><![CDATA[<p>Хорошо.<br />А если пользователь загружает готовый файл, который использует сразу 50 модулей? Нужно будет их сразу проверить. Не будет лм сильно тормозить?</p>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-05-26T09:55:37Z</updated>
			<id>https://forum.guardant.ru/post/5578/#p5578</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5577/#p5577" />
			<content type="html"><![CDATA[<p>Добрый день,</p><p>Да, можно использовать таблицу лицензий для такого приложения.</p><p>Рекомендуем рассмотреть такой вариант:</p><p>каждый модуль программы — отдельная запись в таблице лицензий;<br />для каждого модуля задается свое число лицензий;<br />например: “Линии” = 5, “Круги” = 1.</p><p>проверять и занимать лицензию при фактическом использовании модуля;<br />после завершения работы с модулем освобождать ее;</p><p>По производительности - замедление возможно только если слишком часто создавать/закрывать сессии и постоянно обращаться к ключу.</p>]]></content>
			<author>
				<name><![CDATA[Александра Старчаус]]></name>
				<uri>https://forum.guardant.ru/user/2010/</uri>
			</author>
			<updated>2026-05-22T13:06:01Z</updated>
			<id>https://forum.guardant.ru/post/5577/#p5577</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Лицензирование модульного приложения]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/5576/#p5576" />
			<content type="html"><![CDATA[<p>Версия GuardantSDK-7_0-update_8.msi</p>]]></content>
			<author>
				<name><![CDATA[steevis]]></name>
				<uri>https://forum.guardant.ru/user/1986/</uri>
			</author>
			<updated>2026-05-22T03:45:24Z</updated>
			<id>https://forum.guardant.ru/post/5576/#p5576</id>
		</entry>
</feed>
