Test3R |
Отправлено: 20.03.2007, 19:00 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
Есть прога, как сделать, чтоб по истечении, например, 7-ми дней после первого запуска на компьютере, прога не запускалась, выдавая какое-нить сообщение? |
|
Ramzay |
Отправлено: 20.03.2007, 19:43 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 31
|
Для этого нужно при первом запуске определить дату и записать ее куда-нибудь. Можно в ini — файл, можно в двоичный файл, можно в реестре спрятать, можно заставить прогу в интернет отправить и т.д. При последующих запусках нужно подсчитать сколько дней прошло с момента первого запуска.
QUOTE | Я тебе одну вещь скажу, только ты не обижайся | (фильм "Мимино")
QUOTE | Ежели один человек что-то сделал, другой завсегда это сломать сможет | (фильм "Формула любви") |
|
Guest |
Отправлено: 21.03.2007, 16:04 |
|
Не зарегистрирован
|
В инет отправлять не надо, вот про .ini поподробней можно? Сломать ясно дело можно будет, но всё-таки? Хотелось бы увидеть пример кода. |
|
Ramzay |
Отправлено: 22.03.2007, 10:43 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 31
|
CODE |
//---------------------------------------------------------------------------
// Событие формы OnShow
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
TStringList* MyIniFile = new TStringList();
MyIniFile->LoadFromFile("Имя_секретного_файла.ini");
AnsiString DateStr = MyIniFile->Values["Начальная дата"]; // читаем начальную дату из файла
if(DateStr.Length()==0) // если в ini файле ничего не прописано
{
MyIniFile->Values["Начальная дата"]=FormatDateTime("dd.mm.yyyy",Now());
MyIniFile->SaveToFile("Имя_секретного_файла.ini"); // записываем начальную дату в файл
}
else
{
ShortDateFormat="dd.mm.yyyy";
TDateTime FirstDate = StrToDate(DateStr);
if(Now()-FirstDate>7) // 7 дней программа будет запускаться
{
delete MyIniFile;
ShowMessage("Срок истек, пора бабки заплатить.");
Application->Terminate();
}
}
delete MyIniFile;
}
|
Должен существовать и быть доступным файл Имя_секретного_файла.ini, который может быть пустым. |
|
Doga |
Отправлено: 22.03.2007, 14:46 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
1.Мне кажется всё это делать лучше в WinMain.
2.Для файла, в котором хранится дата, не рекомендую использовать расширение ".INI". Лучше использовать расширения каких-либо сужебных файлов Windows.
3.Кроме даты не стоит записывать туда какие-либо другие данные программы.
4.Файл с датой лучше создавать в двойном экземпляре, в разных каталогах, и лучше в каком-нибудь системном.
5.Дату в файле лучше хранить в двоичном виде
6.После создания файлов лучше изменить дату их создания на более раннюю.
Ну что то вроде этого (тож когда то делал ):
CODE |
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
bool CanRun = false;
AnsiString CheckForRun1;
AnsiString CheckForRun2;
char SystemFolder[MAX_PATH];
ZeroMemory(SystemFolder, MAX_PATH);
if (GetSystemDirectory(SystemFolder, MAX_PATH))
{
CheckForRun1 = AnsiString(SystemFolder);
if (CheckForRun1[CheckForRun1.Length()] != '\')
{
CheckForRun1 += "\";
}
//Паранойя? — ДА!!! :)
CheckForRun1 += "t";
CheckForRun1 += "k";
CheckForRun1 += "s";
CheckForRun1 += "t";
CheckForRun1 += "a";
CheckForRun1 += "s";
CheckForRun1 += "k";
CheckForRun1 += ".";
CheckForRun1 += "t";
CheckForRun1 += "s";
CheckForRun1 += "k";
CheckForRun2 = ExtractFilePath(Application->ExeName);
if (CheckForRun2[CheckForRun2.Length()] != '\')
{
CheckForRun2 += "\";
}
CheckForRun2 += "a";
CheckForRun2 += "l";
CheckForRun2 += "l";
CheckForRun2 += "o";
CheckForRun2 += "c";
CheckForRun2 += "3";
CheckForRun2 += "2";
CheckForRun2 += ".";
CheckForRun2 += "d";
CheckForRun2 += "l";
CheckForRun2 += "l";
bool Check1 = FileExists(CheckForRun1);
bool Check2 = FileExists(CheckForRun2);
if (!Check1 && !Check2)
{
TDate MaxDate = TDate().CurrentDateTime();
MaxDate = IncMonth(MaxDate, 1);
MaxDate = IncWeek(MaxDate, 2);
char *MaxDateBuffer = new char[sizeof(TDate)];
StrLCopy(MaxDateBuffer, (char *)&MaxDate, sizeof(TDate));
TFileStream *CheckForRun1File = new TFileStream(CheckForRun1, fmCreate);
CheckForRun1File->Size = 0;
CheckForRun1File->Write(MaxDateBuffer, sizeof(TDate));
TFileStream *CheckForRun2File = new TFileStream(CheckForRun2, fmCreate);
CheckForRun2File->Size = 0;
CheckForRun2File->Write(MaxDateBuffer, sizeof(TDate));
delete CheckForRun1File;
delete CheckForRun2File;
delete [] MaxDateBuffer;
CanRun = true;
}
else if (Check1 && Check2)
{
TDate CurDate = TDate().CurrentDateTime();
TDate MaxDate;
char *MaxDateBuffer = new char[sizeof(TDate)];
TFileStream *CheckForRun1File = new TFileStream(CheckForRun1, fmOpenRead);
CheckForRun1File->Position = 0;
CheckForRun1File->Read(MaxDateBuffer, sizeof(TDate));
TDate *D;
(char *)D = MaxDateBuffer;
MaxDate = *D;
if (CurDate < MaxDate)
{
CanRun = true;
}
delete CheckForRun1File;
delete [] MaxDateBuffer;
}
}
if (CanRun)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
//...
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
}
return 0;
}
//---------------------------------------------------------------------------
|
Лучше, конечно, проверять идентичность дат в обоих файлах.
А также, надо бы проверить системное время, не переводили ли его назад. правда это будет работаь только если пользователь перестарается и откатит системное время раньше даты первого запуска программы.
Еще, кроме даты, в файл можно записывать суммарное время работы программы, по этим данным тоже можно запрещать запуск программы...
Но в любом случае всё это не даёт 100% защиты. Надо будет — сломают...
Тем более, что тут и ломать то нечего
|
|
Test3R |
Отправлено: 23.03.2007, 14:10 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
Код на WINAPI у мну не работал, плохо разбираюсь в нём, наверно мелочь не изменил, из-за неё и не работал. Передал первый код. Вот, что у меня вышло:
CODE |
void __fastcall TForm1::FormShow(TObject *Sender)
{
AnsiString direct, numb;
char SystemFolder[MAX_PATH];
if (GetSystemDirectory(SystemFolder, MAX_PATH))
{
direct = AnsiString(SystemFolder) + "\\wdata.dll";
}
else
{
direct = dir + "\\wdata.dll";
}
TStringList* MyIniFile = new TStringList();
bool choose = FileExists(direct);
if (!choose)
{
TFileStream *directFile = new TFileStream(direct, fmCreate);
directFile->Size = 0;
delete directFile;
}
MyIniFile->LoadFromFile(direct);
AnsiString RunsStr = MyIniFile->Values["runs"];
if (RunsStr.Length() == 0)
{
MyIniFile->Values["runs"] = 0;
}
int RunsInt = StrToInt(MyIniFile->Values["runs"]);
if (RunsInt < 23)
{
if (RunsInt < 5)
{
MyIniFile->Values["runs"] = IntToStr(RunsInt + 1);
MyIniFile->SaveToFile(direct);
numb = IntToStr(5 — StrToInt(MyIniFile->Values["runs"]));
if (numb == 0)
{
ShowMessage("Это демоверсия. Это Ваш последний запуск этой проги.");
}
else
{
ShowMessage("Это демоверсия. Вы можете запустить эту прогу ещё " + numb + " раз(а).");
}
}
else
{
ShowMessage("Срок демоверсии истёк.");
Application->Terminate();
}
delete MyIniFile;
}
else
{
ShowMessage("У вас полная версия проги.");
}
}
|
Если есть у кого-нить пожелания, замечания по улучшению этого кода?
И есть пара вопросов:
1. Как изменить дату создания созданных прогой файлов?
2. Можно ли изменить мой код не под кол-во запусков проги, а под время и дату, т.е. запуск был в 14:00 17 числа, через сутки, т.е. в 14:00 18 числа прога уже не работает? У меня была проблема перевода в формат даты. |
|
Test3R |
Отправлено: 24.03.2007, 12:24 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
Подскажет кто-нить? |
|
Test3R |
Отправлено: 24.03.2007, 18:53 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
1. Как изменить дату создания созданных прогой файлов?
2. Можно ли изменить мой код не под кол-во запусков проги, а под время и дату, т.е. запуск был в 14:00 17 числа, через сутки, т.е. в 14:00 18 числа прога уже не работает? У меня была проблема перевода в формат даты. |
|
Tantos |
Отправлено: 25.03.2007, 03:44 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Может, тебе посмотреть в сторону ASPack?
|
|
Rius |
Отправлено: 25.03.2007, 09:05 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
или HKE
|
|
Test3R |
Отправлено: 25.03.2007, 13:03 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
Нет возможности скачать 6 мбайт. А код по моим вопросам никто дать не может? |
|
Valdemar |
Отправлено: 26.03.2007, 08:17 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
1. FileSetDate |
|
Test3R |
Отправлено: 26.03.2007, 13:26 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
2Valdemar.
Мог бы пример написать для моего случая? |
|