C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Ограничение работы проги., Ограничение по времени.
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% защиты. Надо будет — сломают...

Тем более, что тут и ломать то нечего cool.gif
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.
Мог бы пример написать для моего случая?

Вернуться в Вопросы программирования в C++Builder