МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Кафедра ПЗ
ЗВІТ
ДО ЛАБОРАТОРНОЇ РОБОТИ № 5
На тему: «Робота з WinAPI функціями та доступ до системних ресурсів»
З дисципліни : «Методи та засоби КІТ»
Тема роботи: Робота з WinAPI функціями та доступ до системних ресурсів.
Мета роботи: Навчитись працювати з WinAPI функціями та системними ресурсами.
ХІД РОБОТИ:
ЗАВДАННЯ:
Робота з реєстром, зміна відповідних ключів, задання відповідних параметрів.
ТЕКСТ ПРОГРАМИ:
Unit1:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Menus, Buttons, Registry, Unit2, XPMan;
type
TForm1 = class(TForm)
lbKeys: TListBox;
lvPair: TListView;
PopupMenu1: TPopupMenu;
pmChange: TMenuItem;
pmDel: TMenuItem;
N1: TMenuItem;
cbRoot: TComboBox;
SBar1: TStatusBar;
pmCreate: TMenuItem;
PopupMenu2: TPopupMenu;
pmCreateKey: TMenuItem;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure ShowSubKey(_hkey: HKEY);
procedure lbKeysClick(Sender: TObject);
procedure lbKeysDblClick(Sender: TObject);
procedure cbRootChange(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure pmCreateKeyClick(Sender: TObject);
procedure pmCreateClick(Sender: TObject);
procedure pmChangeClick(Sender: TObject);
procedure pmDelClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Const RootW: array[0..5]of HKEY=( HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG, HKEY_DYN_DATA);
implementation
{$R *.dfm}
var
path: array[0..300] of string;
fullp: string;
ip: integer;
root: HKEY;
Vals: TStringList;
_Stop: boolean = false;
NeedVal: integer;
Data : string;
NeedName: string;
cc: integer;
vname : pchar;
sname: string;
_type: cardinal;
dat: array[0..4096] of char;
sbuf: string;
procedure TForm1.FormCreate(Sender: TObject);
begin
root:=HKEY_LOCAL_MACHINE;
ShowSubKey(root);
end;
procedure TForm1.cbRootChange(Sender: TObject);
begin
root:=RootW[cbRoot.ItemIndex];
ip:=0; fullp:=''; SBar1.SimpleText:='';
lbKeys.Clear;
lbKeysDblClick(self)
end;
procedure TForm1.ShowSubKey(_hkey: HKEY);
var
buf: ShortString; SubKNum, ValNum, lsname,lvname,lvdata: DWord;
ltime: dword; name: PChar; k: cardinal;
begin
RegQueryInfoKey(_hkey,@buf,@length(buf),nil,@SubKNum,@lsname,nil, @ValNum,@lvname,@lvdata,nil,@ltime);
lbKeys.Items.BeginUpdate;
lvPair.Clear; lbKeys.Clear;
if SubKNum<>0 then begin
GetMem(name,lsname+1);
for k:=0 to SubKnum-1 do begin
RegEnumKey(_hkey,k,name,lsname+1);
lbKeys.Items.Add(string(name));
end;
FreeMem(name);
end;
if ip>0 then
lbKeys.Items.Insert(0,'<...>');
lbKeys.Items.EndUpdate;
end;
procedure TForm1.lbKeysDblClick(Sender: TObject);
var
_hkey: HKEY; i: integer;
begin
i:=lbKeys.ItemIndex;
if i>=0 then
if lbKeys.Items.Strings[i]='<...>' then begin
dec(ip);
end
else begin
path[ip]:=lbKeys.Items.Strings[i];
inc(ip);
end;
fullp:='';
for i:=0 to ip-1 do fullp:=fullp+path[i]+'\';
Sbar1.Panels.Items[0].Text:=cbRoot.Text+'\'+fullp;
if RegOpenKeyEx(root,pchar(fullp),0,KEY_EXECUTE ,_hkey) =0 then
begin ShowSubKey(_hkey); end
else ShowMessage('Помилка');
RegCloseKey(_hkey);
end;
procedure TForm1.lbKeysClick(Sender: TObject);
var
buf: array[0..100] of char; SubKNum, ValNum: integer;
lsname,lvname,lvdata: dword; ltime: dword;
i, k, n: dword; vname: PChar;
st1: string; bufw: dword;
_type: integer; err: longint;
_path: string;
buf0: array[0..255] of char;
_hkey: HKEY;
begin
i:=lbKeys.ItemIndex;
lvPair.Items.Clear;
if (lbKeys.Items.Strings[i]<>'<...>') then
else exit;
if (fullp<>'') then _path:=fullp+lbKeys.Items.Strings[i]+'\'
else _path:=lbKeys.Items.Strings[i]+'\';
if RegOpenKeyEx(root,pchar(_path),0,KEY_EXECUTE ,_hkey)=0 then
begin
RegQueryInfoKey(_hkey,@buf,@n,nil,@SubKNum,@lsname,nil, @ValNum,@lvname,@lvdata,nil,@ltime);
if ValNum=0 then exit;
getmem(vname,lvname+1);
lvPair.Items.BeginUpdate;
for k:=0 to valNum-1 do begin
n:=lvname+1;
RegEnumValue(_hkey,k,vname,n,nil,@_type,nil,nil);
case _type of
REG_SZ: st1:='String';
REG_DWORD: st1:='DWord';
REG_BINARY: st1:='Binary';
else st1:='---';
end;
if length(vname)=0 then lvPair.Items.Add.Caption:='""'
else lvPair.Items.Add.Caption:=string(vname);
lvPair.Items[lvPair.Items.Count-1].SubItems.Add(st1);
n:=lvdata+200;
err:=RegQueryValueEx (_hkey, vname, nil, @_type, @buf0, @n);
if err<>0 then showmessage(inttostr(err));
if _type=REG_SZ then st1:=string(buf0)
else begin
bufw:=Dword(buf0[0])+(Dword(buf0[1])shl 8)+(Dword(buf0[2])shl 16)+(Dword(buf0[3])shl 32);
if _type=REG_DWORD then st1:=inttostr(bufw);
if _type=REG_BINARY then st1:=(IntToHex(bufw,8));
end;
lvPair.Items[lvPair.Items.Count-1].SubItems.Add(string(st1));
end;
lvPair.Items.EndUpdate;
freemem(vname);
RegCloseKey(_hkey);
end
else ShowMessage('Вказаний розділ не знайдений');
end;
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
if(lvPair.ItemIndex>=0) then begin
pmChange.Enabled:=true;
pmDel.Enabled:=true;
end
else begin
pmChange.Enabled:=false;
pmDel.Enabled:=false;
end;
end;
//створення/видалення параметрів
procedure TForm1.pmCreateKeyClick(Sender: TObject);
var
_hk: hkey;
name: string;
er: dword;
begin
InputQuery('Створення разділу','Імя',name);
er:=RegCreateKeyEx(root,pchar(fullp+name+'\'),0,'',REG_OPTION_NON_VOLATILE,
KEY_CREATE_SUB_KEY,nil,_hk,nil);
if er<>0 then ShowMessage(IntToStr(er))
else begin
RegOpenKeyEx(root,pchar(fullp),0,KEY_READ,_hk);
ShowSubKey(_hk);
end;
RegCloseKey(_hk);
end;
procedure TForm1.pmCreateClick(Sender: TObject);
var
_hk: hkey; sval: string;
BWVal: dword;
_Type, size: cardinal;
p: pointer;
begin
FormInput:=TFormInput.Create(form1);
if sender=pmChange then with FormInput do begin
ledName.Text:=lvPair.Selected.Caption;
ledVal.Text:=lvPair.Selected.SubItems.Strings[1];
if lvPair.Selected.SubItems.Strings[0]='String' then rbStr.Checked:=true
else if lvPair.Selected.SubItems.Strings[0]='Binary' then rbBin.Checked:=true
else rbDW.Checked:=true;
end;
FormInput.ShowModal;
if FormInput.ModalResult=mrOk then begin
if RegOpenKeyEx(root,pchar(fullp+lbKeys.Items.Strings[lbKeys.ItemIndex]),
0,KEY_SET_VALUE,_hk) =0 then with FormInput do begin
if Sender=pmChange then
RegDeleteValue(_hk,pchar(lvPair.Selected.Caption));
if rbStr.Checked then begin
_Type:=REG_SZ; sval:=ledVal.Text;
size:=sizeof(sval);
RegSetValueEx(_hk,pchar(ledName.Text),0, _Type, pchar(sval), size) ;
end
else begin
if rbBin.Checked then begin
try _Type:=REG_BINARY; BWval:=StrToInt(ledVal.Text);
except ShowMessage('Значення повинне бути представленим в'+ ' десятковій системі числення'); exit; end;
end
else begin _Type:=REG_DWORD; BWval:=StrToInt(ledVal.Text); end;
size:=sizeof(dword);
RegSetValueEx(_hk,pchar(ledName.Text),0, _Type, @BWVal, size) ;
end; end;
RegCloseKey(_hk);
lbKeysClick(Self);
end;
FormInput.Free;
end;
procedure TForm1.pmChangeClick(Sender: TObject);
begin
pmCreateClick(Sender);
end;
procedure TForm1.pmDelClick(Sender: TObject);
var _hk: hkey;
begin
if RegOpenKeyEx(root,pchar(fullp+lbKeys.Items.Strings[lbKeys.ItemIndex]),
0,KEY_SET_VALUE,_hk) =0
then
RegDeleteValue(_hk,pchar(lvPair.Selected.Caption));
lbKeysClick(Self);
end;
end.
Unit2:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TFormInput = class(TForm)
btnOk: TButton;
btnCancel: TButton;
GroupBox1: TGroupBox;
rbStr: TRadioButton;
rbDW: TRadioButton;
rbBin: TRadioButton;
GroupBox2: TGroupBox;
ledName: TLabeledEdit;
ledVal: TLabeledEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormInput: TFormInput;
implementation
{$R *.dfm}
end.
ПРОТОКОЛ:
ВИСНОВОК:
На цій лабораторній роботі я навчився працювати з WinAPI функціями та системними ресурсами. Мною була створена програма – редактор реєстру.