Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизСоздание пароля Найти похожие ветки
← →
AndreyK_ (2004-12-27 21:14) [0]Уважаемые Мастера,помогите пожалуйста.
Вообще я хочу чтобы при первом запуске моей проги спрашивала пользователя ввести свой пароль. При следующем запуске, чтобы спрашивало введенный в первый раз пароль.
Запись его в отдельный файл не подходит.
Я создал RES файл, подключил к проекту. Загрузил в поток, проверил если там пароль. Если его нет то его надо туда добавить-этого я и не знаю.
Искал как это сделать, но не получилось найти.
Помогите, а то уже неделю мучаюсь.
← →
Fay © (2004-12-27 21:19) [1]>> Запись его в отдельный файл не подходит
Это почему?
← →
Fay © (2004-12-27 21:22) [2]Уверен на 99.99%, что в конечном итоге пароль окажется в файле 8)
← →
Bork (2004-12-27 21:23) [3]т.е. надо записать пароль в реестр?
← →
Fay © (2004-12-27 21:24) [4]А реестр записан на каменных скрижалях, да?
← →
Bork (2004-12-27 22:08) [5]
> А реестр записан на каменных скрижалях, да?
Если бы он был чем-то материальным его бы уже давно пропили!!!
← →
Bork (2004-12-27 22:09) [6]
> А реестр записан на каменных скрижалях, да?
Если бы он был чем-то материальным его бы уже давно пропили!!!
← →
AndreyK_1 (2004-12-27 22:33) [7]Прога у меня один файл. Отдельный файл пользователь может нечайно удалить. Реестр- при переустановке 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);
А что дальше делать я не знаю.
← →
TButton © (2004-12-27 23:39) [8]
> Реестр- при переустановке Windows очищается.
реестр очищается и рег едитом, причем выборочно и гораздо быстрее.
← →
ASoft (2004-12-28 02:57) [9]>>AndreyK_
Ты хочешь, что б пароль каждый раз прикомпилировался к EXE`шнику?
← →
Erik1 © (2004-12-28 11:10) [10]Неправильным путем идете товарищ! Недадо exe фаил мучать, это бесполезно, туда ничего незапишется.
← →
Neznaika © (2004-12-28 11:20) [11]>>Прога у меня один файл. Отдельный файл пользователь может >>нечайно удалить. Реестр- при переустановке Windows очищается.
Ну дак засунь этот файл подальше например Document and setting\ApplicationData\и т.д. и т.п.
← →
Плохиш © (2004-12-28 11:21) [12]
>AndreyK_1 (27.12.04 22:33) [7]
>Прога у меня один файл. Отдельный файл пользователь может нечайно
>удалить. Реестр- при переустановке Windows очищается.
Ну и что, ну введёт пользователь пароль ещё раз, а ты его сохранишь. Он(пользователь) этого даже не заметит.
← →
Neznaika © (2004-12-28 11:27) [13]
> Прога у меня один файл. Отдельный файл пользователь может
> нечайно удалить. Реестр- при переустановке Windows очищается.
Вообще с трудом представляю себе пользователя который лазиет в Program File и удаляет все что под руку попалось....
← →
AndreyK_2 (2004-12-28 12:30) [14]Так а вообще можно что-нибудь в exe записать?
← →
Digitman © (2004-12-28 13:19) [15]
> AndreyK_2
можно.
файл с расширением ехе - такой же файл как и все прочие файлы
← →
AndreyK_3 (2004-12-28 14:23) [16]А во время выполнения программы можно например *.res записать в exe? Если можно то как (или никто не знает)?
← →
Digitman © (2004-12-28 14:36) [17]
> во время выполнения программы можно например *.res записать
> в exe?
только недокументированными ("хакерскими") способами.
и лучше ими не пользоваться.
можно поступить, например, так :
1. реализовать dll, которая собственно и будет выполнять обновление ехе любым удобным способом
2. непосредственно перед завершением приложение вызывает на выполнение rundll32.ехе, передавая параметрами имя этой длл, имя ф-ции, производящей обновление ехе-файла, данные для обновления
3. стартовавшая длл ждет пока приложение завершится, а затем обычным образом открывает ехе-файл и производит в нем необходимые обновления
← →
Svut (2004-12-28 15:38) [18]Вот листинг для записи данных в незапущенный 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.
← →
Svit © (2004-12-28 15:40) [19]Опечатался, Svut - это я=)
← →
AndreyK_4 (2004-12-28 21:12) [20]Большое спасибо Svit и Digitman ©
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c