Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2012, 19:55   #1
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
Восклицание закрытие программы по дате

Как сделать, чтобы после первого запуска программы, которая написана на Delphi (точное день и время) программа закрылась ровно через пять дней именно после первого запуска, даже если программу запускали много раз все эти дни.
krikaved вне форума Ответить с цитированием
Старый 16.03.2012, 20:09   #2
grom333
Форумчанин
 
Аватар для grom333
 
Регистрация: 21.10.2008
Сообщений: 337
По умолчанию

Логика: При запуске программы проверяем в реестре запись, например DATREG=16.03.2012. Если эта запись есть, то считываешь 16.03.2012 и сравниваешь с сегодняшней датой (NOW). ЕСли она больше 5 дней, то form1.close; Если нет то ничего не делаем.
Если нет записи никакой, то записываем в реестр дату.
Лучше быть последним из львов, чем первым среди шакалов.
Мой чат
community on struggle with zoomics
grom333 вне форума Ответить с цитированием
Старый 16.03.2012, 20:57   #3
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от grom333 Посмотреть сообщение
Логика: При запуске программы проверяем в реестре запись, например DATREG=16.03.2012. Если эта запись есть, то считываешь 16.03.2012 и сравниваешь с сегодняшней датой (NOW). ЕСли она больше 5 дней, то form1.close; Если нет то ничего не делаем.
Если нет записи никакой, то записываем в реестр дату.
Как это реализовать программно?
P.S. Повышу репутацию
krikaved вне форума Ответить с цитированием
Старый 16.03.2012, 21:30   #4
grom333
Форумчанин
 
Аватар для grom333
 
Регистрация: 21.10.2008
Сообщений: 337
По умолчанию

Конечно, задавали бы лучше конкретные вопросы! :
1. Работа с реестром. В Uses добавляем registry.
И примерное чтение-запись под себя исправляйте. Нужно в FormCreate например, поставить код.

2.
Код:
procedure TForm1.zapis;
var reg:TRegistry;
dat:string
begin
// Для dat отредактируйте его вид, например dd.mm.yyyy. НУ и естественно, чтобы оно было Tdate.
dat:='12.03.2012';
 reg:=TRegIniFile.Create;
 reg.RootKey:=HKEY_LOCAL_MACHINE;
 reg.OpenKey('SOFTWARE\MICROSOFT\Prog\Date', true);
 reg.WriteString(dat,Edit1.Text);
 reg.CloseKey;
 reg.Free;
end;

procedure TForm1.reading(Sender: TObject);
var reg:TRegistry;
begin
 reg:=TRegIniFile.Create;
 reg.RootKey:=HKEY_LOCAL_MACHINE;
 reg.OpenKey('SOFTWARE\MICROSOFT\Prog\Date', false);
 edit1.Text:=reg.ReadString(dat);
 reg.CloseKey;
 reg.Free;
end;
Лучше быть последним из львов, чем первым среди шакалов.
Мой чат
community on struggle with zoomics
grom333 вне форума Ответить с цитированием
Старый 19.03.2012, 17:26   #5
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

Спасибо, что откликнулись!
1) У меня в реестре по такому пути "HKEY_LOCAL_MACHINE\SOFTWARE\MICROS OFT\Prog\Date" нет такого раздела Prog! Windows 7 x 64.
2) значение dat (дата первого открытия файла) записывается в реестр (или в другое место) один раз после первого открытия файла, после второго открытия файла в этот день или на следующий день эта процедура перестаёт работать и ничего больше не записывает. Где тогда использовать procedure TForm1.zapis ?
3) а можно не использовать Edit1 или сделать его невидимым (Edit1.Visible:=false; ). Если сделать Edit1 невидимым, то будет ли работать программа?

Код:
...
var
  Form1: TForm1;
  reg:TRegistry;
  dat:string;

implementation

{$R *.dfm}

procedure TForm1.zapis;
begin
// Для dat отредактируйте его вид, например dd.mm.yyyy. НУ и естественно, чтобы оно было Tdate.
//dat:='19.03.2012';
{!!! значение dat (дата первого открытия файла) записывается
в реестр (или в другое место) один раз после первого открытия файла,
после второго открытия файла в этот день или на следующий день эта процедура
перестаёт работать и ничего больше не записывает !!!}

 dat:=DateToStr(Date);
 reg:=TRegIniFile.Create;
 reg.RootKey:=HKEY_LOCAL_MACHINE;
 reg.OpenKey('SOFTWARE\MICROSOFT\Prog\Date', true);
 reg.WriteString(dat,Edit1.Text);
 reg.CloseKey;
 reg.Free;
end;

procedure TForm1.reading;
begin
 reg:=TRegIniFile.Create;
 reg.RootKey:=HKEY_LOCAL_MACHINE;
 reg.OpenKey('SOFTWARE\MICROSOFT\Prog\Date', false);
 edit1.Text:=reg.ReadString(dat);
 reg.CloseKey;
 reg.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
reading();
end;

procedure TForm1.FormShow(Sender: TObject);
begin
if  edit1.Text = reg.ReadString(dat + 5) then // что-то типа такого, только правильное исполнение
Form1.Close;
end;

end.

Последний раз редактировалось krikaved; 19.03.2012 в 17:33.
krikaved вне форума Ответить с цитированием
Старый 20.03.2012, 13:18   #6
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

а можно дурацкий вопрос?
зачем вам закрывать прогу по дате?
неужто вы так ее защитить пытаетесь?
лучше погуглите что-нить про защиту по.
xrob вне форума Ответить с цитированием
Старый 21.03.2012, 14:38   #7
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
а можно дурацкий вопрос?
зачем вам закрывать прогу по дате?
неужто вы так ее защитить пытаетесь?
лучше погуглите что-нить про защиту по.
Вопрос действительно дурацкий!
Причем тут защита?!
Задача стоит весьма интересная. Если никто не может помочь решить вопрос по дате, то хотя бы подскажите: Каким образом при первом запуске программы можно совершить одно лишь действие и больше его не повторять вовсе, даже если программу потом закрывают и открывают снова. По какому событию это сделать или какая это должна быть функция, подскажите пожалуйста?
krikaved вне форума Ответить с цитированием
Старый 21.03.2012, 15:05   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Каким образом при первом запуске программы можно совершить одно лишь действие и больше его не повторять вовсе, даже если программу потом закрывают и открывают снова.
ну, не сказано, при первом запуске программы где? на данном компьютере, под данной операционной системой (на компьютере может быть НЕСКОЛЬКО операционных систем), под данным пользователем (опять таки, несколько пользователей может быть), в данной локальной/корпоративной сети и т.д.

общий подход должен быть такой. При запуске программа записывает проверяет где-нибудь в "секретном" месте особую отметку. Если этой отметки нет - значит это первый запуск. Пишем туда нашу отметку и выполняем то, что нужно делать при ПЕРВОМ запуске. Если же отметка имеется, значит запуск НЕ ПЕРВЫЙ.
вопрос стоит только в том, где и как делать эту самую отметку...
Но тут всё очень сильно зависит от того, по каким правами запущена программа.
Если под админскими, то всё просто. Как вам уже советовали ранее, пишете отметку в реестр, в раздел HKLM (HKEY_LOCAL_MACHINE)
а вот если запуск осуществлён из под учётной записи с ограниченными правами, то всё значительно хуже... операционная система с нормальной защитой будет препятствовать Вам гадить где не попадя... и я, например, не вижу надёжного и красивого решения при запуске программы из под Windows 7 с включённым UAC и запуске не от имени администратора..



p.s. теоретически можно поднять сайтик, на который оправлять какой-то уникальный ключик и получать ответ... но тогда без интернета программа вообще запускаться не должна.


p.p.s. а действительно, нафига Вам эти сложности?! Как защита, это слабенько! Если мне понадобится, то я на 99.9% уверен, что смогу запустить вашу программу столько раз в день, сколько мне понадобится А если это не защита, то зачем Вам эти танцы с бубном?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2012, 15:16   #9
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. теоретически можно поднять сайтик, на который оправлять какой-то уникальный ключик и получать ответ... но тогда без интернета программа вообще запускаться не должна.
И ктонить снифферит, меняет hosts и по запросу отправляет программе желаемый ею ответ
Интересная тема на счет защиты, почитал бы.
Lime вне форума Ответить с цитированием
Старый 21.03.2012, 15:52   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
И ктонить снифферит, меняет hosts и по запросу отправляет программе желаемый ею ответ
ну, во-первых, запросы/ответы можно шифровать (причём достаточно сурово, протокол "свой-чужой", с использованием сильной криптографии и ЭЦП),
во-вторых, подобный взлом потребует вполне ощутимых затрат времени и сил, наличие определённого опыта, разработка программы, эмулирующей сервер и т.д.
скорее всего проще будет проверку в самой программе отломать...

а в-третьих, самое главное, я где-то написал, что это надёжная "невзламываемая" система??!!!
Вон, автор темы утверждает, что это вообще к защите отношения никакого не имеет. И, следовательно, раз это не защита, то и ломать это никто не будет!
только не спрашивайте меня, зачем TC эти танцы нужны - я сам не понимаю!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие программы nikityan Общие вопросы Delphi 8 01.03.2012 00:33
Закрытие программы SKS Помощь студентам 3 13.11.2011 15:39
Закрытие программы ray_1k Общие вопросы C/C++ 12 09.07.2011 17:40
Закрытие программы Byurrer Общие вопросы C/C++ 8 06.04.2011 17:44
Закрытие программы Zloy_Doomer Общие вопросы Delphi 3 23.06.2008 19:08