有关Registry的问题(200分)

  • 主题发起人 主题发起人 Zephyr
  • 开始时间 开始时间
Z

Zephyr

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中的TRegistry有一个方法RestoreKey,但在Win98中调用总是返回
False,不能成功。查了源码后发现它只是封装了API函数RegRestoreKey,
但API文档中说该函数只支持NT,不知在Win98中如何实现与RegRestoreKey
相同的功能?
 
使用TRegistry的SAVEKEY方法.
 
可以使用open和writeinteger方法
 
您可以到http://sunstone.163.net/
-->编程心得.
看看,也许有帮助.
 
API文档有误,Win98支持RegRestoreKey. (advapi32.dll)
 
o*o: 那为何TRegistry.RestoreKey总是返回False,不能成功呢?
 
Rego:TRegistry;
value:dword
str:string;
xlh:integer;

begin

inherited;
Rego:=TRegistry.Create;
//检查注册码
Rego.RootKey:=HKEY_USERS;
value:=getdiskvolserialid('c');
str:=inttostr(value);
xlh:=strtoint(copy(str,2,4))*26;
if edit1.Text=inttostr(xlh) then

begin

rego.OpenKey('.DEFAULT/Software/ldb/reg',True);
Rego.WriteInteger('pass',xlh);//写入注册码.
showmessage('您已成功注册,谢谢!');
regflag:=1;
rego.Free;
end else

begin

showmessage('您输入的注册码不正确!');
regflag:=0;
end;

end;
 
var
re_id:integer;
registerTemp : TRegistry;
inputstr,get_id:string;
dy,clickedok:boolean;
begin

 dy:=false;
//软件是否已到注册期、及是否允许继续使用的标志,当值为FALSE是为允许使用。
 registerTemp := TRegistry.Create;
//准备使用注册表
 with registerTempdo

 begin

   RootKey:=HKEY_LOCAL_MACHINE;
//存放在此根下
   if OpenKey('Software/Microsoft/Windows/CurrentVersion/Mark',True) then

    // 建一目录,存放标志值。当然也可以存放在已存在的目录下。怎么样,很难发现吧?
    begin

     if valueexists('gc_id') then
begin
//用gc_id的值作为标志,首先判断其存在否?
       re_id:=readinteger('gc_id');//读出标志值
       if (re_id<>0) and (re_id<>100) then
begin
//若标志值为0,则说明已注册。
              //若不为0且值不到100,说明虽未注册,但允许使用的次数尚未达到。
        re_id:=re_id+5;
//允许标志的最大值为100,每次加5,则最多只可用20次。
        Writeinteger('gc_id',re_id);//将更新后的标志值写入注册表中。
     end;

     if re_id=100 then
dy:=true;
//假如值已到100,则应注册。
    end
   else
Writeinteger('gc_id',5);//建立标志,并置初始标志值。
  end;

  if dy then
begin
//若dy值为TRUE,则应提示用户输入注册码,进行注册。
    clickedok:=InputQuery('您使用的是非注册软件,请输入注册码:',' ',inputstr);
    if clickedok then
begin

      get_id:=inttostr(27593758*2);//注册码为55187516,当然可加入更杂的算法。
      if get_id=inputstr then
begin

        Writeinteger('gc_id',0);//若输入的注册码正确,则将标志值置为0,即已注册。
        CloseKey;
        Free;
       end
      else
begin
//若输入的注册码错误,应作出提示并拒绝让其继续使用
        application.messagebox('注册码错误!请与作者联系!','警告框',mb_ok);
        CloseKey;
        Free;
        application.terminate;
//中止程序运行,拒绝让其继续使用
       end;

      end
    else
begin
//若用户不输入注册码,也应作出提示并拒绝让其继续使用
      application.messagebox('请与作者联系,使用注册软件!','警告框',mb_ok);
      CloseKey;
      Free;
      application.terminate;
     end;

  end;

 end;

写一个又注释的,省得我得不到那么多分数,如果能用,那么多给我一点分,谢谢
 
猎人:
  ???
  ……我想……你……还没有明白我的意思吧?
  我并非想问如何在注册表中保存信息,而是想在Win98中把用TRegistry.SaveKey保存
的注册表信息恢复到注册表中,原本应该用RestoreKey,但此方法在Win98中不能成功,
我想知道是否有替代的办法。
 
没人知道吗?
 
不知你的原码如何?
 
其实代码很简单,只是因为有位朋友在编程时用了TRegistry的SaveKey和RestoreKey方法,
却不能成功调用,我帮他问一下啦。

源码大概是这个样子的:
Reg.SaveKey('Software/MyApp/MyKey','FileName');
//这样可成功,即SaveKey返回True
Reg.RestoreKey('Software/MyApp/MyKey','FileName');
//这样总是返回False,不成功

后来看了VCL源码,发现TRegistry.RestoreKey调用API函数RegRestoreKey,而此函数只支持
WinNT。我想知道在Win98中有没有办法实现这个功能。

就这么简单。
 
》我想知道在Win98中有没有办法实现这个功能。
不行
 
还有人需要分数吗?
没有的话,我要执行“旧帖清理操作”了。
 
用TRegistry的loadkey或replacekey方法就可以,
只是有一定限制,只能是HKEY_USERS或HKEY_LOCAL_MACHINE,
一般人要存软件信息,多半存在HKEY_LOCAL_MACHINE,因此应该够用了。
 
啊?我怎么没注意到loadkey这个方法呢?唉,看来我对help研究的还不够透彻。
多谢温柔一刀。
 
接受答案了.
 
后退
顶部