
პირველ რიგში გავერკვიოთ რას უნდ ა აკეთებდეს ჩვენი ჯოინერი:
1) ამოაარქივოს ტემპში საჭირო ფაილები
2) გაუშვას საჭირო ფაილები ტემპიდან
ასეთი რაღაცის გაკეთება შესაძლებელია სხვადასხვანაირად მაგარმა მე ვაკეთებ მასე
ისევე როგორც კრიპტერებს ჩვენი პროგრამაც შედგება 2 პროგრამისგან :
1)პირველი პროგრამა არის კონსტრუქტორი გრაფიკული ინტერფეისით რომელიც განკუთვნილია ბილდის შესაქმნელად
2) მეორე პროგრამა - Stub ეს არის ცენტრაულური პროგრამ რომელიც პასუხისმგებელია ჯოინერიდან ამოიღოს ფაილები გაშვებისას და ასევე გაუშვას ის ტემპ კატალოგიდან
სტაბის დაწერა ჯობს ასემბლერზე რადგან პატარა მოცულობის იქნება და არ გაჭედავს
კონსტრუქტორის დაეწერა შესაძლებელაი delpgi, c# და ა.შ
ამ სტატიაში ორივეს დავწერთ დელფიში
დავიწყოთ
1) ვწერთ კონსტრუქტორს
ვქმნით დელფიში სტანდარტულ პროექტს
შექმნის შემდეგ რას უნდა აკეთებდეს ჩვენი კონსტურქტორი :
1) სტაბის ბოლოში წერდეს ინფორმაციას, ესენია : ფაილის ზომა, ფაილსი სახელი რომელიც უნდა ჩაიწეროს, საერთო ფიალების ოდენობა და საერთო ფაილების ის ოდენობა რომნელიც უნდა გეშვას.
ვქმნით სტრუქტურას
Code:
Type
FileInfRecord = record //ეს ჩვენი სტრუქტურაა სადაც მოხდება მისი წაკითვა სტაბიდან
_filesize: array [0..1000] of cardinal; // ფაილის ზომა
_filename: array [0..1000] of string[100]; //ფაილის სახელი
_filenameStart: array [0..1000] of string[100]; /ფაილის სახელი რომელიც უნდა გაეშვას
_fileCount: cardinal; //ფაილების ოდენობა (საერთო)
_fileCountStart: cardinal; //ფაილების ოდენობა რომელბიც უნ აგეშვას
End;
მთელი კოდის ახსნას აქ ვერ დავიწყებ ვისაც დაინტერესებს სოურსში ნახავთ
დასაწყისისთვის შევასვსოთ სტრუქტურა საჭირო მონაცემებით: ფაილის ზომა, ფაილსი სახელი რომელიც უნდა ჩაიწეროს, საერთო ფიალების ოდენობა და საერთო ფაილების ის ოდენობა რომნელიც უნდა გეშვას
ამისთვის გამოვიყენოთ ვონდოუსის API
ვავსებთ სტრუქტურას მონაცემებით რომელიც შეიყვანა GUI ინტერფეისი მომხმარებელმა
Code:
or i:=0 to ListView1.Items.Count-1 do //ვავსებთ სტრუქტურას ანუ (დასახელება მოცულობა და ა.შ ციკლში)
begin
_fileHeader._filename[i]:=ListView1.Items.Item[i].Caption; //ფაილის სახელი
_fileHeader._filesize[i]:=GetFileSized(ListView1.Items.Item[I].SubItems.Strings[0]+ ListView1.Items.Item[I].Caption); //ხომა
end;
for i:=0 to memo1.lines.count-1 do _FileHeader._filenameStart[i]:=Memo1.Lines[i]; //Сაქ შეგვყავს ფაილის სახელი ორმელიც უნდა გაეშვას
_fileHeader._fileCount:=ListView1.Items.Count; //ფაილების რაოდენობას
Code:
CopyFile(pchar(extractFilePath(application.ExeName)+ 'stub.exe'), pchar(SaveDialog1.FileName), false); //ვაკომპირებთ სტაბს მომხმარებლის მიერ მითითებულ ადგილას
Sleep(100); //ველოდებით 100 მილწამს რომ ფაილმა მოასწროს კომპელაცია
1) ვხსნით ჩვენ დაკოპირებულ სტაბს
2) გადავდივართ ფაილის ბოლოში
3) ვწერთ ჩვენ სტურქტურას
4) შემდეგ ციკლში ვწერთ ფილას რომელიც უნდა მივაკროთ
Code:
_distFile:=CreateFile(pchar(SaveDialog1.FileName), GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); //ვხსნით ჩვენ დაკოპირებულ სტაბს
SetFilePointer(_distFile, 0, nil, FILE_END); //გადავდივართ ფაილის ბოლოში
WriteFile(_distFile, _fileHeader, sizeOf(_fileHeader), _temp, nil); //ვწერთ ჩვენ სტურქტურას სტაბში
for i:=0 to ListView1.Items.Count-1 do //შემდეგ ციკლში ვწერთ ფილას რომელიც უნდა მივაკროთ
begin
_fromFile:=CreateFile(pchar(ListView1.Items.Item[i].SubItems.Strings[0]+ ListView1.Items.Item[i].Caption), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0); //ვხსნით ფილას რომელიც უნდა მივაკროთ
repeat
ReadFile(_fromFile, _buff, sizeOf(_buff), _temp, nil); //ვკითხულობთ ფილას რომელიც უნდა მივაკროთ
WriteFile(_distFile, _buff, _temp, _temp2, nil);//ვწერთ ყველაფერს სტაბში
ZeroMemory(@_buff, sizeOf(_buff));//ვწმენდავთ ბუფერს
until _temp<>1025;
CloseHandle(_fromFile);
end;
CloseHandle(_distFile);
ShowMessage('მიკრობა წარმატებით დასრულდა!');
2) კონსტუქტორი გვაქვს მაგრამ ჩამტვირთავი პროგრამის გარეშე ის უსარგებლოა ამიტომ უნდ აშევქმნა თ აალი პროექტი და დ ავწეროთ რამოდენიმნე კოდის ხაზი. ჩამტვირთავი პროგრამა უნდა იყოს მინიმალური მოცულობის რაც ნიშნავს რომ იუნდა მოვიცილოთ ზედმეტი ნაწილი. წავშალოთ Uses ყველა მოდული დავტოვოთ მხოლოდ Windows და ShellAPI. აღვწეროთ სტრუქტურა FileInfRecord. ის უნდა გამოიყურებოდეს როგორც ჩვენი კონსტრუქტორი .
ახალა გავარკვიოთ რას აკეთებს ჩვენი სტაბი:
1) გაშვებისას უშვებს თავსი თავს
2) კითხულობს ჩვენს სტრუქტურას
3) სტუქტურაშიი დაფუძნებულ მიონაცემებზე იღებს ფაილებს ტემპ კატალოგიდან და უშვებს
Code:
type
FileInfRecord = record // ეს სტრუქტურა რომელიც წაიკითხავს მთელი ინფორმაციას სტაბიდან
_filesize: array [0..1000] of cardinal; // ფაილის ზომა
_filename: array [0..1000] of string[100]; //ფაილის სახელი
_filenameStart: array [0..1000] of string[100];
_fileCount: cardinal; //ფაილების ოდენობა (საერთო)
_fileCountStart: cardinal; //ფაილების ოდენობა (რომლებიც უნდ ჩავწეროთ)
შემდეგ ვქნით ცვლადს სტრუქტურასთან მიუშაობისთვის: _fileHeader:FileInfRecord;
fileSource:=Createfile(pchar(ParamStr(0)), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0); //უშვებს თავსი ტავას
SetFilePointer(_fileSource, mySize, nil, FILE_BEGIN); //გადადის სტაბის ბოლოში
ReadFile(_fileSource, _fileHeader, sizeOf(_fileHeader), _temp, nil); // კითხულობს სტრუქტურის სათაურს
Start:=_fileHeader._fileCountStart;//ამ ცვლადში შეგვაქვს ფაილები რომლებიც უნდა ჩაიწეროს
if _fileHeader._fileCount=0 //თუ არ წაიკითხა
then
begin
Exit; //გამოვდივართ
end;
GetTempPath(MAX_PATH, ShortPath); //ვპულობთ ტემპ ფაილს
for i:=0 to _fileHeader._FileCount-1 do
begin
//ვქმით ფაილს რომელიც მიაკრავს ერთმაეთს ფაილებს:
_fileDist:=CreateFile(pchar(string(ShortPath)+string(_fileHeader._filename[i])), GENERIC_WRITE, FILE_SHARE_WRITE,nil,CREATE_NEW, 0, 0);
for j:=1 to _fileHeader._filesize[i] do
begin
ReadFile(_fileSource, _buff, sizeOf(_buff), _temp, nil);// ვკითხულობთ მონაცემებს სტაბიდან
WriteFile(_fileDist, _buff, sizeOf(_buff), _temp, nil); // ვწერთ იმ მონაცემებს რომლებიც შევმქმენით
end;
CloseHandle(_fileDist);
Sleep(100);
end;
End;
დასაწყისისთვის ჩვენ უნდა გავხსნათ ფაილის წაიკითხვა ჩამტვირთველი პროგრამისთვის. ამის შემდეგ ვასრულებთ გადანაცვლებას მისამართამდ, საიდანაც დაიწყება ინფორმაციული ბლოკი.
ვაკომმპელირებთ მადლობა ყურადღებისთვის
Attachments
-
343 KB Views: 8