Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание пароля [D7, WinXP]


AndreyK_ ©   (2004-12-27 21:14:00) 

Уважаемые Мастера,помогите пожалуйста.
Вообще я хочу чтобы при первом запуске моей проги спрашивала пользователя ввести свой пароль. При следующем запуске, чтобы спрашивало введенный в первый раз пароль.
Запись его в отдельный файл не подходит.
Я создал RES файл, подключил к проекту. Загрузил в поток, проверил если там пароль. Если его нет то его надо туда добавить-этого я и не знаю.
Искал как это сделать, но не получилось найти.
Помогите, а то уже неделю мучаюсь.


AndreyK_4   (2004-12-28 21:12:00) [1]

Большое спасибо Svit и Digitman ©


Svit   (2004-12-28 15:40:00) [2]

Опечатался, Svut - это я=)


Svut   (2004-12-28 15:38:00) [3]

Вот листинг для записи данных в незапущенный exe.
unit AppendEXE;

interface

uses sysutils;

type
 TPayloadFooter = packed record
   WaterMark: TGUID;
   ExeSize: LongInt;
   DataSize: LongInt;
 end;

type
 TPayload = class(TObject)
 private
   fFileName: string;    
   fOldFileMode: Integer;
   fFile: File;          
   procedure Open(Mode: Integer);
   procedure Close;
 public
   constructor Create(const FileName: string);
   function HasPayload: Boolean;
   function PayloadSize: Integer;
   procedure SetPayload(const Data; const DataSize: Integer);
   procedure GetPayload(var Data);
   procedure RemovePayload;
 end;

const
 cReadOnlyMode = 0;
 cReadWriteMode = 2;
 cWaterMarkGUID: TGUID = // arbitrary watermark constant
   '{9FABA105-EDA8-45C3-89F4-369315A947EB}';

implementation

procedure InitFooter(out Footer: TPayloadFooter);
begin
 FillChar(Footer, SizeOf(Footer), 0);
 Footer.WaterMark := cWaterMarkGUID;
end;

function ReadFooter(var F: File;
 out Footer: TPayloadFooter): Boolean;
var
 FileLen: Integer;
begin
 FileLen := FileSize(F);
 if FileLen > SizeOf(Footer) then
 begin
   Seek(F, FileLen - SizeOf(Footer));
   BlockRead(F, Footer, SizeOf(Footer));
 end
 else
   FillChar(Footer, SizeOf(Footer), 0);
 Result := IsEqualGUID(Footer.WaterMark, cWaterMarkGUID);
end;

procedure TPayload.Close;
begin
 CloseFile(fFile);
 FileMode := fOldFileMode;
end;

constructor TPayload.Create(const FileName: string);
begin
 inherited Create;
 fFileName := FileName;
end;

procedure TPayload.GetPayload(var Data);
var
 Footer: TPayloadFooter;
begin
 Open(cReadOnlyMode);
 try
   if ReadFooter(fFile, Footer)
     and (Footer.DataSize > 0) then
   begin
     Seek(fFile, Footer.ExeSize);
     BlockRead(fFile, Data, Footer.DataSize);
   end;
 finally
   Close;
 end;
end;

function TPayload.HasPayload: Boolean;
begin
 Result := PayloadSize > 0;
end;

procedure TPayload.Open(Mode: Integer);
begin
 fOldFileMode := FileMode;
 AssignFile(fFile, fFileName);
 FileMode := Mode;
 Reset(fFile, 1);
end;

function TPayload.PayloadSize: Integer;
var
 Footer: TPayloadFooter;
begin
 Result := 0;
 Open(cReadOnlyMode);
 try
   if ReadFooter(fFile, Footer) then
     Result := Footer.DataSize;
 finally
   Close;
 end;
end;

procedure TPayload.RemovePayload;
var
 PLSize: Integer;
 FileLen: Integer;
begin
 PLSize := PayloadSize;
 if PLSize > 0 then
 begin
   Open(cReadWriteMode);
   FileLen := FileSize(fFile);
   try
     Seek(fFile, FileLen - PLSize - SizeOf(TPayloadFooter));
     Truncate(fFile);
   finally
     Close;
   end;
 end;
end;

procedure TPayload.SetPayload(const Data;
 const DataSize: Integer);
var
 Footer: TPayloadFooter;
begin
 RemovePayload;
 if DataSize > 0 then
 begin
   Open(cReadWriteMode);
   try
     InitFooter(Footer);
     Footer.ExeSize := FileSize(fFile);
     Footer.DataSize := DataSize;
     Seek(fFile, Footer.ExeSize);
     BlockWrite(fFile, Data, DataSize);
     BlockWrite(fFile, Footer, SizeOf(Footer));
   finally
     Close;
   end;
 end;
end;

end.


Digitman   (2004-12-28 14:36:00) [4]


> во время выполнения программы можно например *.res записать
> в exe?


только недокументированными ("хакерскими") способами.
и лучше ими не пользоваться.

можно поступить, например, так :
1. реализовать dll, которая собственно и будет выполнять обновление ехе любым удобным способом

2. непосредственно перед завершением приложение вызывает на выполнение rundll32.ехе, передавая параметрами имя этой длл, имя ф-ции, производящей обновление ехе-файла, данные для обновления

3. стартовавшая длл ждет пока приложение завершится, а затем обычным образом открывает ехе-файл и производит в нем необходимые обновления


AndreyK_3   (2004-12-28 14:23:00) [5]

А во время выполнения программы можно например *.res записать в exe? Если можно то как (или никто не знает)?


Digitman   (2004-12-28 13:19:00) [6]


> AndreyK_2


можно.
файл с расширением ехе - такой же файл как и все прочие файлы


AndreyK_2   (2004-12-28 12:30:00) [7]

Так а вообще можно что-нибудь в exe записать?


Neznaika   (2004-12-28 11:27:00) [8]


> Прога у меня один файл. Отдельный файл пользователь может
> нечайно удалить. Реестр- при переустановке Windows очищается.


Вообще с трудом представляю себе пользователя который лазиет в Program File и удаляет все что под руку попалось....


Плохиш   (2004-12-28 11:21:00) [9]


>AndreyK_1   (27.12.04 22:33) [7]

>Прога у меня один файл. Отдельный файл пользователь может нечайно
>удалить. Реестр- при переустановке Windows очищается.

Ну и что, ну введёт пользователь пароль ещё раз, а ты его сохранишь. Он(пользователь) этого даже не заметит.


Neznaika   (2004-12-28 11:20:00) [10]

>>Прога у меня один файл. Отдельный файл пользователь может >>нечайно удалить. Реестр- при переустановке Windows очищается.

Ну дак засунь этот файл подальше например Document and setting\ApplicationData\и т.д. и т.п.


Erik1   (2004-12-28 11:10:00) [11]

Неправильным путем идете товарищ! Недадо exe фаил мучать, это бесполезно, туда ничего незапишется.


ASoft   (2004-12-28 02:57:00) [12]

>>AndreyK_
Ты хочешь, что б пароль каждый раз прикомпилировался к EXE`шнику?


TButton   (2004-12-27 23:39:00) [13]


> Реестр- при переустановке Windows очищается.

реестр очищается и рег едитом, причем выборочно и гораздо быстрее.


AndreyK_1   (2004-12-27 22:33:00) [14]

Прога у меня один файл. Отдельный файл пользователь может нечайно удалить. Реестр- при переустановке Windows очищается.
А вообще я делаю так

var
Stream :TMemoryStream;
HResInfo: THandle;
MemHandle: THandle;
ResPtr: PByte;
ResSize: Longint;
password:string;
begin
HResInfo:=FindResource(HInstance, 'MYPASSWORD','STRING');
MemHandle:=LoadResource(HInstance, HResInfo);
ResPtr:= LockResource(MemHandle);
Stream := TMemoryStream.Create;
ResSize := SizeofResource(HInstance, HResInfo);
Stream.SetSize(ResSize+SizeOf(password));
Stream.Write(ResPtr^, ResSize);
Stream.Write(password, SizeOf(password));
Stream.Seek(0, 0);

А что дальше делать я не знаю.


Bork   (2004-12-27 22:09:00) [15]


> А реестр записан на каменных скрижалях, да?

Если бы он был чем-то материальным его бы уже давно пропили!!!


Bork   (2004-12-27 22:08:00) [16]


> А реестр записан на каменных скрижалях, да?

Если бы он был чем-то материальным его бы уже давно пропили!!!


Fay   (2004-12-27 21:24:00) [17]

А реестр записан на каменных скрижалях, да?


Bork   (2004-12-27 21:23:00) [18]

т.е. надо записать пароль в реестр?


Fay   (2004-12-27 21:22:00) [19]

Уверен на 99.99%, что в конечном итоге пароль окажется в файле 8)


Fay   (2004-12-27 21:19:00) [20]

>> Запись его в отдельный файл не подходит
Это почему?


Наверх

Титульная страница Поиск, карта сайта Написать письмо