86 lines
3.8 KiB
HTML
86 lines
3.8 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|||
|
|
|||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|||
|
<head>
|
|||
|
<link rel="Stylesheet" type="text/css" href=
|
|||
|
"../../default.css" />
|
|||
|
<meta http-equiv="Content-Type" content=
|
|||
|
"text/html; charset=utf-8" />
|
|||
|
|
|||
|
<title>Шаг 1.7: Ограничиваем бесплатные обновления</title>
|
|||
|
</head>
|
|||
|
|
|||
|
<body>
|
|||
|
<h1>Шаг 1.7: Ограничиваем бесплатные обновления</h1><strong>Схема
|
|||
|
работы</strong>
|
|||
|
|
|||
|
<p>В момент защиты приложения VMProtect запоминает дату, когда это
|
|||
|
происходило. Эта дата является для системы лицензирования датой
|
|||
|
сборки приложения. В серийном номере можно прописать максимальную
|
|||
|
дату сборки, для которой подойдет этот номер. Таким образом, если
|
|||
|
при создании ключа Вы пропишете в него текущую дату + 1 год, то
|
|||
|
ключ подойдет ко всем релизам Вашей программы, которые вы
|
|||
|
выпустите в течение года. К релизу, выпущенному через год и 1
|
|||
|
день ключ уже не подойдет и у пользователя будет выбор:
|
|||
|
пользоваться более старой версией или купить новый ключ, который
|
|||
|
будет работать еще год.</p><strong>Пробуем на деле</strong>
|
|||
|
|
|||
|
<p>Поместите в ini-файл строчку вида MaxBuildDate=YYYYMMDD -
|
|||
|
например, такую:</p>
|
|||
|
<pre class="code">MaxBuildDate=20000101
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>В тестовом режиме система лицензирования считает датой сборки
|
|||
|
сегодняшнее число, поэтому важно, чтобы дата, указанная в строке,
|
|||
|
уже прошла. Т.е. максимум - вчера. Модифицируйте исходный код
|
|||
|
функции <strong>main()</strong>, чтобы он выглядел так:</p>
|
|||
|
<pre class="code">int main(int argc, char **argv)
|
|||
|
{
|
|||
|
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
|||
|
|
|||
|
int res = VMProtectSetSerialNumber(serial);
|
|||
|
print_state(res);
|
|||
|
|
|||
|
if (res)
|
|||
|
{
|
|||
|
VMProtectSerialNumberData sd = {0};
|
|||
|
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
|||
|
printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay);
|
|||
|
printf("please register!\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
printf("I'm registered\n");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>Тогда при запуске программы вы увидите следующее:</p>
|
|||
|
<pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED
|
|||
|
max. build date: y = 2000, m = 1, d = 1
|
|||
|
please register!
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>Заменив в ini-файле дату на сегодняшнюю или завтрашнюю, мы
|
|||
|
получим "рабочую" программу:</p>
|
|||
|
<pre class="code">state = 0
|
|||
|
I'm registered
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>Удалите из ini-файла строку MaxBuildDate=..., чтобы она не
|
|||
|
мешала нам в дальнейшем.</p><br />
|
|||
|
<a href="step18_blacklist.htm">Следующий шаг</a>
|
|||
|
<br />
|
|||
|
<br />
|
|||
|
<br />
|
|||
|
<br />
|
|||
|
<hr noshade="noshade" size="1" />
|
|||
|
|
|||
|
<div align="center">
|
|||
|
© 2006-2015 Copyright VMProtect Software
|
|||
|
</div>
|
|||
|
</body>
|
|||
|
</html>
|