{请在Uses中包含Registry单元} procedure TForm1.Button1Click(Sender:TObject); var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey := HKEY—LOCAL—MACHINE;//指定根键为HKEY—LOCAL—MACHINE //打开主键Software\Microsoft\Windows\CurrentVersion if OpenKey( ′Software\Microsoft\Windows\CurrentVersion′,false ) then begin memo1.lines.add('Windows版本:′+ ReadString(′Version′)); memo1.lines.add('Windows版本号:′+ ReadString(′VersionNumber′)); memo1.lines.add(′Windows子版本号:′+ ReadString(′SubVersionNumber′)); end; CloseKey;//关闭主键 Destroy;//释放内存 end; end;
var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey:=HKEY—LOCAL—MACHINE; if OpenKey(′Software\Microsoft\Windows\CurrentVersion\Run′,True) then WriteString(′delphi′,′C:\Program Files\borland\delphi3\bin\delphi32.exe′); CloseKey; Destroy; end; end;
{将程序strExeFileName置为自动启动 } function StartUpMyProgram ( strPrompt,strExeFileName : string ) : boolean; var registerTemp : TRegistry; begin registerTemp := TRegistry.Create; //建立一个Registry实例 with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE //找到Software\Microsoft\Windows\CurrentVersion\Run if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',True) then //写入自己程序的快捷方式信息 begin WriteString( strPrompt, strExeFileName ); result := true; end else result := false; //善后处理 CloseKey; Free; end; end;
{调用StartUpMyProgram, 使Delphi随WINDOWS启动而自动运行 } procedure TForm1.Button1Click(Sender: TObject); begin memo1.lines.add('开始'); if StartUpMyProgram('delphi','C:\Program Files\borland\delphi3\bin\delphi32.exe') then memo1.lines.add('成功') else memo1.lines.add('失败') end;
---- 应用之二:实现文件关联 当MS WORD 安装在你的系统中时,它会把.DOC 文件与自己关联,当你双击一个DOC 文件,就会启动MS WORD,打开你指定的DOC文件。你也可以把一个文件类型与一个程序关联起来,其秘密还是在注册表中。如果打开注册表,找到HKEY_CLASSES_ROOT,就会发现这里已经有很多文件类型。 你也可以在这里增加一个键,建立自己的文件关联。
{将文件类型strFileExtension与程序 strExeFileName相关联,strDiscription为文件类型说明 } function AssignToProgram(strFileExtension,strDiscription,strExeFileName : string ) : boolean; var registerTemp : TRegistry; begin registerTemp := TRegistry.Create; //建立一个Registry实例 with registerTemp do begin RootKey:=HKEY_CLASSES_ROOT; //设置根键值为HKEY_CLASSES_ROOT //根据文件类型的扩展名,创建或打开对应的键名.FileExt,如DBF对应'.DBF' if OpenKey( '.' + strFileExtension, true ) then begin result := false; exit; end; //设置键.FileExt默认值为FileExt_Auto_File,如'.DBF'对应'DBF_Auto_File' WriteString('',strFileExtension + '_Auto_File'); CloseKey; //写入自己程序的信息 //根据文件类型的扩展名,创建或打开对应的键名 FileExt_Auto_File //'.DBF'对应'DBF_Auto_File' if OpenKey(strFileExtension + '_Auto_File', true ) then begin result := false; exit; end; //设置默认值文件类型说明,如DBF可对应'xBase数据表' WriteString('',strDiscription); CloseKey; //创建或打开键名FileExt_Auto_File\Shell\open\command,该键为表示操作为'打开' //'.DBF'对应'DBF_Auto_File\shell\open\command' if OpenKey(strFileExtension + '_Auto_File\shell\open\command', true ) then begin result := false; exit; end; //设置该键的默认值为打开操作对应的程序信息 //如DBF可对应'C:\Program Files\Borland\DBD\DBD32.EXE' WriteString('',strExeFileName + ' %1'); CloseKey; Free; end; end;
{调用AssignToProgram,使DBF文件与DBD32.EXE关联 } procedure TForm1.Button3Click(Sender: TObject); begin memo1.lines.add('开始'); if AssignToProgram('DBF','xBase数据表','C:\Program Files\borland\dbd\dbd32.exe') then memo1.lines.add('成功') else memo1.lines.add('失败') end;
{检测系统中是否安装了BDE } function IsBDEInstalled : boolean; var registerTemp : TRegistry; begin registerTemp := TRegistry.Create; //建立一个Registry实例 with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE //查询Software\Borland\Database Engine result := OpenKey('Software\Borland\Database Engine',false); //善后处理 CloseKey; Free; end; end;
{调用IsBDEInstalled,检测系统中是否安装了BDE } procedure TForm1.Button4Click(Sender: TObject); begin memo1.lines.add('开始'); if IsBDEInstalled then memo1.lines.add('已安装了BDE') else memo1.lines.add('未安装BDE') end;
//保存快捷方式的文件 persistfileTemp := shelllinkTemp as IPersistFile; if S_OK = persistfileTemp.Save( PWChar( strDesktopDirectory ) , false ) then result := true //保存成功,返回True else result := false; end;
{调用CreateShortcutOnDesktop,为Delphi在桌面上建立快捷方式 } procedure TForm1.Button2Click(Sender: TObject); begin memo1.lines.add('开始'); if CreateShortcutOnDesktop('C:\Program Files\borland\delphi3\bin\delphi32.exe','%1') then memo1.lines.add('成功') else memo1.lines.add('失败') end;
Function dblBackSlash(t:string):string; var k:longint; begin result:=t; {Strings are not allowed to have} for k:=length(t) downto 1 do {single backslashes} if result[k]='\' then insert('\',result,k); end;
Procedure ProcessBranch(root:string); {recursive sub-procedure} var values, keys:tstringlist; i,j,k:longint; s,t:string; {longstrings are on the heap, not on the stack!} begin writeln(f); {write blank line} case rootsection of HKEY_CLASSES_ROOT : s := 'HKEY_CLASSES_ROOT'; HKEY_CURRENT_USER : s := 'HKEY_CURRENT_USER'; HKEY_LOCAL_MACHINE : s := 'HKEY_LOCAL_MACHINE'; HKEY_USERS : s := 'HKEY_USERS'; HKEY_PERFORMANCE_DATA: s := 'HKEY_PERFORMANCE_DATA'; HKEY_CURRENT_CONFIG : s := 'HKEY_CURRENT_CONFIG'; HKEY_DYN_DATA : s := 'HKEY_DYN_DATA'; end;
Writeln(f,'['+s+'\'+root+']'); {write section name in brackets} reg.OpenKey(root,false); values := tstringlist.create; keys:=tstringlist.create; reg.getvaluenames (values); {get all value names} reg.getkeynames (keys); {get all sub-branches} for i:=0 to values.count-1 do {write all the values first} begin s := values[i]; t := s; {s=value name} if s= ''then s:='@' {empty means "default value", write as @} else s:='"' + s + '"'; {else put in quotes} write(f,dblbackslash(s)+ '=' ); {write the name of the key to the file} Case reg.Getdatatype(t) of {What type of data is it?} rdString, rdExpandString: {String-type} Writeln(f,'"' + dblbackslash(reg.readstring(t) + '"')); rdInteger: {32-bit unsigned long integer} Writeln(f,'dword:' + inttohex(reg.readinteger(t),8)); { write an array of hex bytes if data is "binary." Perform a line feed after approx. 25 numbers so the line length stays within limits } rdBinary : begin write(f,'hex:'); j := reg.getdatasize(t); {determine size} getmem(p,j); {Allocate memory} reg.ReadBinaryData(t,p^,J); {read in the data, treat as pchar} for k:=0 to j-1 do begin Write(f,inttohex(byte(p[k]),2)); {Write byte as hex} if k<>j-1 then {not yet last byte?} begin write(f,','); {then write Comma} if (k>0) and ((k mod 25)=0) then {line too long?} writeln(f,'\'); {then write Backslash + lf} end; {if} end; {for} freemem(p,j); {free the memory} writeln(f); {Linefeed} end; ELSE writeln(f,'""'); {write an empty string if datatype illegal/unknown} end; {case} end; {for} reg.closekey;
{value names all done, no longer needed} values.free;
{Now al values are written, we process all subkeys} {Perform this process RECURSIVELY...} for i := 0 to keys.count -1 do ProcessBranch(root+'\'+keys[i]); keys.free; {this branch is ready} end;
begin if regroot[length(regroot)]='\' then {No trailing backslash} setlength(regroot,length(regroot)-1); Assignfile(f,filename); {create a text file} rewrite(f); IF ioresult<>0 then EXIT; Writeln(f,'REGEDIT4'); {"magic key" for regedit} reg:=tregistry.create; try reg.rootkey:=rootsection; ProcessBranch(regroot); {Call the function that writes the branch and all subbranches} finally reg.free; {ready} close(f); end; end;
end.
2003-11-20 12:22:54 读写网络上其他计算机注册表的代码
procedure NetReg; var R: TRegistry; S: TStringList; begin R:=TRegistry.Create; S:=TStringList.Create; WriteLn(R.RegistryConnect('\\OtherPC')); WriteLn(R.OpenKeyReadOnly('Software')); R.GetKeyNames(S); WriteLn(S.CommaText); S.Free; R.Free; end;
procedure TForm1.FormCreate(Sender: TObject); begin Reg := TRegistry.Create; Reg.OpenKey ('\', False); UpdateAll; // select the current root(选择当前的根目录) ComboKey.ItemIndex := 1; ComboLast.Items.Add('\'); /////// ComboLast.ItemIndex := 0; end;
//更新 procedure TForm1.UpdateAll; begin Caption := Reg.CurrentPath; if Caption = ' then Caption := '[Root]'; if Reg.HasSubKeys then Reg.GetKeyNames(ListSub.Items) else ListSub.Clear; Reg.GetValueNames(ListValues.Items); end;
procedure TForm1.FormDestroy(Sender: TObject); begin Reg.CloseKey; Reg.Free; end;
procedure TForm1.ListSubClick(Sender: TObject); var NewKey, Path: string; nItem: Integer; begin // get the selection(获取选择项) NewKey := ListSub.Items [ListSub.ItemIndex]; Reg.OpenKey (NewKey, False); // save the current path (eventually adding a \)(在不列出于列表时保存路径) // only if the it is not already listed Path := Reg.CurrentPath; if Path < '\' then Path := '\' + Path; nItem := ComboLast.Items.IndexOf (Path); if nItem < 0 then begin ComboLast.Items.Insert (0, Path); ComboLast.ItemIndex := 0; end else ComboLast.ItemIndex := nItem; UpdateAll; end;
procedure TForm1.ComboLastChange(Sender: TObject); begin Reg.OpenKey (ComboLast.Text, False); UpdateAll; end;
end.
2003-11-20 13:30:00 获得注册表项下的所有值
Var Reg : TRegistry; list : TStrings; i : Integer;
Begin Reg:=TRegistry.Create; Reg.RootKey:='HKEY_LOCAL_MACHINE'; If Reg.OpenKey('\Software\Microsoft\CurrentVersion\Run', false) then Begin List:=TStringList.Create; Reg.GetValueNames(List); For i:=0 to list.Count-1 do If Reg.ValueExists(List[i]) then Begin Case Reg.GetDataType(List[i]) of rdInteger: Reg.ReadInteger(List[i]); rdBinary: Reg.ReadBinaryData(List[i]); else Reg.ReadString(List[i]); End; End; End;
myreg:=Tregistry.Create; //必须在程序单元的uses部分加入Registry myreg.RootKey:=HKEY_LOCAL_MACHINE; if myreg.openkey('software\microsoft\windows\currentversion',false) then memo1.lines.add(' 注册用户名:'+myreg.readstring('RegisteredOwner')); myreg.closekey; 以上仅举几例,获取其他一些信息的方法与此类似,详见源程序。
begin memo1.Lines.Clear; for ch:='A' to 'Z' do begin i:=getdrivetype(pchar(ch+':\')); buffer:=' '+ch+': '; case i of DRIVE_UNKNOWN : buffer:=buffer+'未知类型'; DRIVE_REMOVABLE: buffer:=buffer+'软盘'; DRIVE_FIXED : begin buffer:=buffer+'硬盘'; if getdiskfreespace(pchar(ch+':\'),spc,bps,nofc,tnoc) then begin buffer:=buffer+'总容量:'+inttostr((spc*bps*tnoc) div (1024*1024))+'MB'; buffer:=buffer+'剩余:'+inttostr((spc*bps*nofc) div (1024*1024))+'MB'; end; end; DRIVE_REMOTE : buffer:=buffer+'网络驱动器'; DRIVE_CDROM :buffer:=buffer+'CD-ROM驱动器'; DRIVE_RAMDISK:buffer:=buffer+'RAM虚拟驱动器'; end; if (ch >'D') and (i=1) then break; if i< >1 then memo1.Lines.Add(buffer); end;
case getkeyboardtype(0) of //获取键盘类型 1: buffer:=' 键盘: IBM PC/XT或兼容类型(83键)'; 2: buffer:=' 键盘: Olivetti "ICO"(102键)'; 3: buffer:=' 键盘: IBM PC/AT(84键)'; 4: buffer:=' 键盘: IBM增强型(101或102键)'; 5: buffer:=' 键盘: Nokia 1050'; 6: buffer:=' 键盘: Nokia 9140'; 7: buffer:=' 键盘: Japanese'; end; memo1.lines.add(buffer);
globalmemorystatus(meminfo); //获取系统内存数量 memo1.lines.add(' 物理内存:'+inttostr(meminfo.dwTotalPhys div 1024)+' KB'); i:=getsystemmetrics(SM_CLEANBOOT); case i of 0:buffer:='系统启动模式:正常模式'; 1:buffer:='系统启动模式:保护模式'; 2:buffer:='系统启动模式:网络保护模式'; end; memo1.lines.add(buffer); x:=getsystemmetrics(SM_ARRANGE);
//获取系统最小化窗口的起始位置和排列方式 y:=x; x:=x and 3; y:=y and 12; case x of ARW_BOTTOMLEFT : buffer:=' 最小化窗口:自左下角'; ARW_BOTTOMRIGHT : buffer:=' 最小化窗口:自右下角'; ARW_TOPLEFT : buffer:=' 最小化窗口:自左上角'; ARW_TOPRIGHT : buffer:=' 最小化窗口:自右上角'; end; case y of ARW_LEFT : buffer:=buffer+'横向排列'; ARW_UP : buffer:=buffer+'纵向排列'; ARW_HIDE : buffer:=buffer+'隐藏'; end; memo1.lines.add(buffer);
//从注册表中获取CPU标识,Windows版本,产品标识,注册单位名称及用户名 myreg:=Tregistry.Create; myreg.RootKey:=HKEY_LOCAL_MACHINE; if myreg.OpenKey('hardware\description\system\centralprocessor\0',false) then memo1.lines.add(' CPU标识:'+myreg.ReadString('VendorIdentifier')); myreg.closekey; if myreg.openkey('software\microsoft\windows\currentversion',false) then begin memo1.lines.add(' windows版本:'+myreg.ReadString('Version')); memo1.lines.add(' 版本号:'+myreg.ReadString('VersionNumber')+''+myreg.ReadString('Subversionnumber')); memo1.lines.add(' 产品标识:'+myreg.Readstring('ProductID')); memo1.lines.add('注册单位名称:'+myreg.readstring('RegisteredOrganization')); memo1.lines.add(' 注册用户名:'+myreg.readstring('RegisteredOwner')); end; myreg.CloseKey; myreg.Free; end; end.
2003-11-20 13:44:20 注册表配置ODBC的详细例子
【思路】:先在ODBC中配置然后到注册表中去看有什么增加,然后照样写进去就可以了,但是这样做有一个问题,SQL Server默认是用命名管道,如果要用TCP/IP协议请在注册表中找1433,就能找到它是在那里.照样写进去就OK了。 var reg : TRegistry; begin reg := TRegistry.Create; //建立一个Registry实例 with reg do begin RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE //找到Software\ODBC\ODBC.INI\ODBC Data Sources if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources' True) then begin //注册一个DSN名称 WriteString( 'DSN' 'SQL Server' ); end else begin //创建键值失败 ShowMessage('增加ODBC数据源失败'); exit; end; CloseKey; //找到或创建Software\ODBC\ODBC.INI\masdsn 写入DSN配置信息 if OpenKey('Software\ODBC\ODBC.INI\DSN' True) then begin WriteString( 'Driver' 'C:\Windows\System\sqlsrv32.dll' ); WriteString( 'LastUser' 'Username' ); WriteString( 'Password' 'password' ); WriteString( 'Server' 'ServerName' ); end else //创建键值失败 begin Showmessage('增加ODBC数据源失败'); exit; end; CloseKey; Free; ShowMessage('增加ODBC数据源成功'); end;
type TFontRegData = record Name : string[100]; Size : integer; Color : TColor; Style : set of TFontStyle; Charset : byte; Height : integer; Pitch : TFontPitch; PixelsPerInch : integer; end;
// Before writing font data to the registry you have to copy all needed data to a record of fixed size
procedure PrepareFontDataForRegistry(Font : TFont;var RegData : TFontRegData); begin { Copy font data to record for saving to registry } //复制字体数据到记录并保存到注册表中 with RegData do begin Name:=Font.Name; Size:=Font.Size; Color:=Font.Color; Style:=Font.Style; Charset:=Font.Charset; Height:=Font.Height; Pitch:=Font.Pitch; PixelsperInch:=Font.PixelsPerInch; end; end;
procedure PrepareFontfromRegData(Font : TFont;RegData : TFontRegData); begin { Set font data to values read from registry } //设置来自注册表的字体数据的值 with Font do begin Name:=RegData.Name; Size:=RegData.Size; Color:=RegData.Color; Style:=RegData.Style; Charset:=RegData.Charset; Height:=RegData.Height; Pitch:=RegData.Pitch; PixelsperInch:=RegData.PixelsPerInch; end; end;
//初始化 procedure TForm1.FormCreate(Sender: TObject); begin Font:=TFont.Create; Font.Name:='Arial'; end;
begin Reg:=TRegistry.Create; Reg.OpenKey('Software\Test',true); if Reg.ValueExists('FontData') then Reg.ReadBinaryData('FontData',rd,Sizeof(rd)); reg.Free; PrepareFontFromRegData(Font,rd); end;
procedure TForm1.FormDestroy(Sender: TObject); begin Font.Free; end;
一、程序启动时,通过搜索注册表,判断是否已有密码,来确定窗口的显示内容。不过事先应有以下的声明然后才能使用: 在user中加入TRegistry,在var声明中加入以下几个窗体变量: var TheReg: TRegistry; KeyName,ValueStr,tempStr:String; procedure TfrmPass.FormShow(Sender: TObject); begin TheReg := TRegistry.Create; try TheReg.RootKey := HKEY-LOCAL-MACHINE; KeyName := ′SOFTWARE\Mypassword′; //有该键则打开,没有则创建 if TheReg.OpenKey(KeyName, True) then begin tempStr:=ExtractFileName(Application.ExeName); //读取密码 ValueStr:=TheReg.ReadString(tempStr); //密码不为空则修改窗体为验证密码 if ValueStr<>′′ then begin edit2.Visible:=false; frmPass.Caption:=′验证密码′; edit1.SetFocus; OK.Caption:=′确定′; end //密码为空则修改窗体为设置密码对话框 else begin showmessage(′第一次使用请设置密码!′); edit2.Visible:=true; frmPass.Caption:=′请设置新密码′; edit1.SetFocus; OK.Caption:=′设置′; end; TheReg.CloseKey; end; finally TheReg.Free; end; end; 二、按钮的响应代码:包括新设密码和验证密码。 procedure TfrmPass.OKClick(Sender: TObject); begin //根据Edit2的显示与否判断已有密码,进行验证 if edit2.Visible=false then begin if pass(edit1.text)=ValueStr then begin showmessage(′密码正确!′); end else begin showmessage(′密码不正确!无权操作!′); halt; end; end //无密码,设置新密码 else begin if edit1.text=edit2.text then begin TheReg := TRegistry.Create; TheReg.RootKey := HKEY-LOCAL-MACHINE; KeyName := ′SOFTWARE\Mypassword′; if TheReg.OpenKey(KeyName, True) then TheReg.WriteString(tempStr,pass(edit1.text)); TheReg.CloseKey; end else begin showmessage(′再次键入的密码不一致,请重输!′); edit1.text:=′′; edit2.text:=′′; edit1.SetFocus; end; //进行下一步操作... end; end; 三、密码变换程序:注意要预先定义。 这个变换小程序在笔者看来还不算很复杂,只进行了两次变换,不过,想要破译也是得费点劲。读者还可以采用其他的数学函数进行更为复杂的变换。 function pass(pstr:string):string; var str,str1:string; i,j:integer; begin str:=pstr; for i:=1 to length(str) do begin //进行第一次变换 j:=(i*i*i mod (i+20))+(i*i mod (i+10))+i*2+1; str1:=str1+chr(ord(str[i])+j); //第二次变换 j:=(i*i*i mod (i+10))+(i*i mod (i+20))+i*2+1; str1:=str1+chr(ord(str[i])+j); end; pass:=str1; end;