首页  编辑  

注册表文件关联

Tags: /超级猛料/Registry.注册表和INI/   Date Created:

uses

 registry, shlobj;

procedure TForm1.RegisterFileType(prefix: string; exepfad: string);

var

 reg: TRegistry;

begin

 reg := TRegistry.Create;

 try

   reg.RootKey := HKEY_CLASSES_ROOT;

   //create a new key  --> .pci

   reg.OpenKey('.' + prefix, True);

   try

     //create a new value for this key --> pcifile

     reg.Writestring('', prefix + 'file');

   finally

     reg.CloseKey;

   end;

   //create a new key --> pcifile

   reg.CreateKey(prefix + 'file');

   //create a new key pcifile\DefaultIcon

   reg.OpenKey(prefix + 'file\DefaultIcon', True);

   //and create a value where the icon is stored --> c:\project1.exe,0

   try

     reg.Writestring('', exepfad + ',0');

   finally

     reg.CloseKey;

   end;

   reg.OpenKey(prefix + 'file\shell\open\command', True);

   //create value where exefile is stored --> c:\project1.exe "%1"

   try

     reg.Writestring('', exepfad + ' "%1"');

   finally

     reg.CloseKey;

   end;

 finally

   reg.Free;

 end;

 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 RegisterFileType('pci', 'c:\project1.exe');

end;

*****************************************

注意,在下面这些操作之后,应该发送一个刷新的消息给系统:

   SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);

通过对注册表进行修改,可以删除一种文件名后缀与某个应用程序相关联

程序例如下:

procedure deregisterFileType(ft: String);

//ft:将要删除文件关联的后缀,如.tst

var

   myreg:TRegistry;

   key: String;

begin

   myreg:=TRegistry.Create;

   myReg.RootKey:=HKEY_CLASSES_ROOT;

   myReg.OpenKey(ft, False);

   key:=MyReg.ReadString('');

   MyReg.CloseKey;

   myReg.DeleteKey(ft);

   myReg.DeleteKey(key);

   myReg.Free;

end;

调用例子:

Example:

      deregisterFileType('.tst');

通过对注册表进行修改,可以删除资源管理器上下文件菜单中的新建子菜单中的命令

程序例如下:

procedure FileTDelNew(ft: String);

//fp:文件后缀键值,如.tst

var

   myReg:TRegistry;

begin

   myReg:=TRegistry.Create;

   myReg.RootKey:=HKEY_CLASSES_ROOT;

   if not myReg.KeyExists(ft) then

   begin

       MyReg.Free;

       Exit;

   end;

   MyReg.OpenKey(ft, true);

   if MyReg.KeyExists('ShellNew') then

       MyReg.DeleteKey('ShellNew');

   MyReg.CloseKey;

   MyReg.Free;

end;

调用例子:

Example:

      FileTDelNew('.tst');

原理说明:

   将后缀键的下面的子键ShellNew删除即可。

通过对注册表进行修改,可以删除资源管理器上下文件菜单中对某类文件的处理命令

程序例如下:

procedure FileTDelAction(key, name: String);

//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile

//name:命令名称

var

   myReg: TRegistry;

begin

   myReg:=TRegistry.Create;

   myReg.RootKey:=HKEY_CLASSES_ROOT;

   //如果给出的是一个文件后缀,则转换成对应的描述键值

   //在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的

{    if key[1] = '.' then

       key:= copy(key,2,maxint)+'_auto_file';}

   if key[1] = '.' then

   begin

       if myReg.KeyExists(key) then  //首先看注册表中是否有此键,有则取出

       begin

           myReg.OpenKey(key, false);

           key:=myReg.ReadString ('');

       end

       else

           key:= copy(key,2,maxint)+'_auto_file';

   end;

   if key[Length(key)-1] <> '\' then

       key:=key+'\';

   myReg.OpenKey('\'+key+'shell\', true);

   if myReg.KeyExists(name) then

       myReg.DeleteKey(name);

   myReg.CloseKey;

   myReg.Free;

end;

调用例子:

Example:

      FileTDelAction('test','edit');

原理说明:

   将注册表中对应的键值删除就可以了。

通过对注册表进行修改,可以实现一种文件名后缀与某个应用程序相关联

程序例如下:

procedure registerfiletype(ft,key,desc,icon,prg:string);

//ft:文件名后缀,如可以为'.tst'或'afile.tst'

//key:在注册表中的键值,要唯一

//desc:关联程序的描述

//icon:缺省的程序图标,如Application.ExeName+',1',可以缺省

//prg:对应的应用程序

var myreg : treginifile;

   ct : integer;

begin

    // 取文件的后缀

    ct := pos('.',ft);

    while ct > 0 do begin

          delete(ft,ct,1);

          ct := pos('.',ft);

    end;

    if (ft = '') or (prg = '') then exit; //判断后缀及应用程序是否有效

    ft := '.'+ft;

    myreg := treginifile.create('');

    try

       myreg.rootkey := hkey_classes_root; // 根应该为HKEY_CLASSES_ROOT

       if key = '' then key := copy(ft,2,maxint)+'_auto_file';

       // 如果没给出键值,则自动创建一个

       myreg.writestring(ft,'',key); // 写入描述的键值

       myreg.writestring(key,'',desc); // 写入描述

       if icon <> '' then

          myreg.writestring(key+'\DefaultIcon','',icon);

          // 写入缺省图标

       myreg.writestring(key+'\shell\open\command','',prg+' "%1"');

          //写入相关联的应用程序

    finally

           myreg.free;

    end;

end;

调用例子:

Example:

      registerFileType('.tst',

                       'testfile',

                       '测试关联文件',

                       Application.ExeName+',1',

                       Application.ExeName);

原理说明:

   程序关联的键值放在注册表根为HKEY_CLASSES_ROOT下面。实现文件关联要写入两

个键值:后缀键值和描述键值(可用术语用的不对)

   如实现将.tst与程序tstfile.exe相关联

   其中后缀键值形为:  .tst       myprogram

   key值为文件后缀,取值为对于key的一个描述

   描述键值形为:       myprogram 文件描述

   其中还有相应的子键,如缺省的程序图标,形为:

                        myprogram\DefaultIcon  '', 'tstfile.exe,1'

   打开命令,形为:

                        myprogram\shell\open\command '', 'tstfile.exe "%1"'

   写入完这两个键值后就可以实现文件与应用程序相关联了。    

通过对注册表进行修改,可以在资源管理器上下文件菜单中的新建子菜单中增加新的命令

程序例如下:

type

    TFileNewType = (ftNullFile, ftFileName, ftCommand);

procedure FileTAddNew(ft, param: String; newType: TFileNewType);

//fp:文件后缀键值,如.tst

//param:传递参数

//newType:新建的类型,有空文件, 文件名, 命令

var

   myReg:TRegistry;

begin

   myReg:=TRegistry.Create;

   myReg.RootKey:=HKEY_CLASSES_ROOT;

   if not myReg.KeyExists(ft) then

       begin

       MyReg.Free;

       Exit;

   end;

   myReg.OpenKey(ft+'\ShellNew', true);

   case NewType of

       ftNullFile : MyReg.WriteString('NullFile', '');

       ftFileName : MyReg.WriteString('FileName', param);

       ftCommand  : MyReg.WriteString('Command', param);

   end;

   MyReg.CloseKey;

   MyReg.Free;

end;

调用例子:

Example:

      FileTAddNew('.tst','', ftNullFile);

原理说明:

   在后缀键的下面增加子键ShellNew。如在上下文菜单中增加新建.tst文件的命令

   在.tst键值下面增加子键    .tst\ShellNew     'NullFile', ''

通过对注册表进行修改,可以在资源管理器上下文菜单中增加对某类文件的处理命令

程序例如下:

procedure FileTAddAction(key, name, display, action: String);

//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile

//name:命令名称

//display:在上下文件菜单上显示的提示信息

//action:对应的命令

var

   myReg:TRegistry;

begin

   myReg:=Tregistry.Create;

   myReg.RootKey:=HKEY_CLASSES_ROOT;

   if name='' then name:=display;

   //如果给出的是一个文件后缀,则转换成对应的描述键值

   //在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的

{    if key[1] = '.' then

       key:= copy(key,2,maxint)+'_auto_file';}

   if key[1] = '.' then

   begin

       if myReg.KeyExists(key) then  //首先看注册表中是否有此键,有则取出

       begin

           myReg.OpenKey(key, false);

           key:=myReg.ReadString ('');

       end

       else

           key:= copy(key,2,maxint)+'_auto_file';

   end;

   if key[Length(key)-1] <> '\' then

       key:=key+'\';

   if name[Length(name)-1] <> '\' then

       name:=name+'\';

   myReg.OpenKey(key+'Shell\'+name, true);

   myReg.WriteString('', display);

   MyReg.CloseKey;

   MyReg.OpenKey(key+'Shell\'+name+'Command\', true);

   MyReg.WriteString('', action);

   myReg.Free;

end;

调用例子:

Example:

      FileTAddAction('testfile','edit','Edit',Application.ExeName+'-e "%1"');

原理说明:

   如.txt对应的描述键值为testfile

   则在testfile的键值下面,增加动作子键

         如:  testfile\shell\         '', Edit

               testfile\shell\Command\ '', 'c:\testfile -e "%1"'