>>不要使用DELPHI封装的TRegist
>>ry类,而是使用Windows API中操作注册表的API来完成.
why??
delphi中File->Open,找到delphi的安装目录,打开这个文件 source/vcl/Registry.pas,然后找到delphi替你写好的打开注册表健,和读取的方法。(delphi是使用Windows API中操作注册表的API来完成)
然后使用,ctrl+c,ctrl+v(或者你自己喜欢的方式)将代码拷贝到你的程序中,然后做一些修改适应你的程序。ok搞掂.
>>ry类,而是使用Windows API中操作注册表的API来完成.
why??
delphi中File->Open,找到delphi的安装目录,打开这个文件 source/vcl/Registry.pas,然后找到delphi替你写好的打开注册表健,和读取的方法。(delphi是使用Windows API中操作注册表的API来完成)
然后使用,ctrl+c,ctrl+v(或者你自己喜欢的方式)将代码拷贝到你的程序中,然后做一些修改适应你的程序。ok搞掂.
procedure TForm1.Button1Click(Sender: TObject);
var Ret,Key:HKey;
DataType,DataLen:integer;
Buffer:string;
begin
Ret:=RegOpenKey(HKEY_LOCAL_MACHINE,'Software\Aerofox\FoxMail',Key);
if Ret=0 then
Ret:=RegQueryValueEx(Key,PChar('Executable'),nil,@DataType,nil,@DataLen)
else
ShowMessage('Error!'); case DataType of
REG_SZ,REG_EXPAND_SZ,REG_MULTI_SZ:
begin
SetString(Buffer,nil,DataLen);
RegQueryValueEx(Key,PChar('Executable'),nil,@DataType,PByte(PChar(Buffer)),@DataLen);
Edit1.Text:=Buffer;{显示键值}
end;
end;
end;
如果你没有shlwapi的声明单元,则简单的声明如下函数入口:
function SHGetValue(
hKey: HKEY;
subKeyName, valueName: PChar;
valueType: PDWORD;
dataBuf: Pointer;
bufSize: PDWORD
):DWORD; stdcall; external 'shlwapi.dll' name 'SHGetValueA';
随后只需要调用该函数就可以得到你所需要的路径值:
function GetAppPath: string;
const
REGROOT: HKEY = HKEY_LOCAL_MACHINE;
REGKEYNAME = 'Software\Aerofox\FoxMail';
REGVALUENAME = 'Executable';
var
valueType: DWORD;
cbSize: DWORD;
begin
valueType:=REG_SZ;
SetLength(Result,MAX_PATH);
cbSize:=Length(Result);
if SHGetValueA(
REGROOT, REGKEYNAME, REGVALUENAME,
@valueType, PChar(Result), @cbSize) = ERROR_SUCCESS then
begin
SetLength(Result,Length(PChar(Result)));
end else
begin
SetLength(Result,0);
raise Exception.Create('Path not found in registry.');
end;
end;
需要注意的是,如果你需要频繁的或者大量的访问注册表中的多个键值,最好用advapi中的相关函数,当然用Delphi自己的TRegistry类就更是简单高效了。