Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > создание файла единократно при первом запуске


Автор: PIF 29.4.2005, 16:46
Здравствуйте! Скажите, как при первом запуске моей программы на данной машине, она(программа) создавала текстовый файл, и записывала в него имя компьютера. При последующих запусках, это файл не затрагивался.
Заранее спасибо!!!

Автор: _hunter 29.4.2005, 17:08
дык в чем проблема? смотри есть файл или нет. если нету -- создавай. если есть -- не трогай его...

Автор: Poseidon 29.4.2005, 17:18
Подтверждаю слова _hunter кодом:
Код
if not FileExists('C:\temp.txt') then //создаем файл

Автор: Poseidon 29.4.2005, 17:30
Вот примерный код
Код
Function ReadComputerName:string;
var
i:DWORD;
p:PChar;
begin
i:=255;
GetMem(p, i);
GetComputerName(p, i);
Result:=String(p);
FreeMem(p);
end;

procedure TForm1.FormCreate(Sender: TObject);
var f: TextFile;
begin
if not FileExists('C:\temp.txt')
then
  begin
  AssignFile(f,'C:\temp.txt');
  ReWrite(f);
  Write(f,ReadComputerName);
  CloseFile(f);
  end;
end;

Хотя зачем это нужно? Ну пусть программа переписывает каждый раз имя. Или оно что, часто меняется?

Автор: PIF 29.4.2005, 19:02
тогда такой вопрос немогли-бы вы объяснить поподробней следующий код
Код

procedure TForm1.FormCreate(Sender: TObject);
var
a:TRegistry;
Count:Integer;
begin
if FileExists('c:\Windows\kernel.fhd')=false then begin
a:=TRegistry.Create;
a.RootKey:=HKEY_LOCAL_MACHINE;
a.OpenKey('\Software\Microsoft\oor',true);
a.WriteInteger('RunCount',1);
a.CloseKey;
a.Free;
FileCreate('c:\Windows\kernel.fhd');
end
else begin
a:=TRegistry.Create;
a.RootKey:=HKEY_LOCAL_MACHINE;
a.OpenKey('\Software\Microsoft\oor',true);
Count:=a.ReadInteger('RunCount');
a.CloseKey;
a.Free;
if Count=3 then begin
halt;
end
else begin
Inc(Count);
a:=TRegistry.Create;
a.RootKey:=HKEY_LOCAL_MACHINE;
a.OpenKey('\Software\Microsoft\oor',true);
a.WriteInteger('RunCount',Count);
a.CloseKey;
a.Free;
FileCreate('c:\Windows\kernel.fhd');
end;
end;
end;

Автор: Ch0bits 29.4.2005, 19:09
Если не находит файл c:\Windows\kernel.fhd, то создаёт ключ в реестре HKEY_LOCAL_MACHINE\Software\Microsoft\oor пишет в него значение RunCount=1

Если файл найден и RunCount<3, то прибавляет его значение.
Если RunCount=3, то завершает программу.

Похоже на очень примитивную защиту по количеству запусков.
Добавлено @ 19:11
Ошибки: Windows не всегда может находиться на C: и называться Windows.

Автор: Poseidon 29.4.2005, 19:13
Обьясняю:
Код
procedure TForm1.FormCreate(Sender: TObject);
var // обьявляем преременные
a:TRegistry;
Count:Integer;
begin
if FileExists('c:\Windows\kernel.fhd')=false then begin // если нет файла c:\Windows\kernel.fhd, то
a:=TRegistry.Create; // инициализируем переменную рееестра
a.RootKey:=HKEY_LOCAL_MACHINE; // открываем ветвь реестра HKEY_LOCAL_MACHINE
a.OpenKey('\Software\Microsoft\oor',true); // открываем в реестре ключь \Software\Microsoft\oor, если ключа нет, создаем
a.WriteInteger('RunCount',1); // записываем в этот ключь параметр DWORD с именем RunCount со значанием 1
a.CloseKey; // закрываем реестр
a.Free; // освобождаем переменную реестра
FileCreate('c:\Windows\kernel.fhd'); // создаем файл c:\Windows\kernel.fhd
end
else begin // если файл c:\Windows\kernel.fhd есть, то
a:=TRegistry.Create; // см. выше
a.RootKey:=HKEY_LOCAL_MACHINE; // см. выше
a.OpenKey('\Software\Microsoft\oor',true); // см. выше
Count:=a.ReadInteger('RunCount'); // присваиваем переменной Count значение, считанное с параметра RunCount
a.CloseKey; // см. выше
a.Free; // см. выше
if Count=3 then begin // если Count равно 3 то
halt; // Инициируеv аварийное завершение программы
end
else begin // если Count не равно 3 то
Inc(Count); // увеличиваем значение переменной Count на один, т.е. Что то вроде Count:= Count+1
a:=TRegistry.Create; // см. выше
a.RootKey:=HKEY_LOCAL_MACHINE; // см. выше
a.OpenKey('\Software\Microsoft\oor',true); // см. выше
a.WriteInteger('RunCount',Count); // см. выше
a.CloseKey; // см. выше
a.Free; // см. выше
FileCreate('c:\Windows\kernel.fhd'); // см. выше
end;
end;
end; 

Добавлено @ 19:15
М-да. Пока обьяснял все по строчке, Vadim999 перегнал и обьяснил в кратце smile

Автор: PIF 29.4.2005, 19:33
Большое вам спасибо, разъяснили!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)