请问如何使自己写的程序跟所有类型的文件关联呢?就象WinRAR一样,每个文件的右键菜单里都有一个WinRAR的项目。谢谢!

解决方案 »

  1.   

    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"'
        写入完这两个键值后就可以实现文件与应用程序相关联了。    
      

  2.   

    楼上答的是实现某一个具体的文件类型的关联,好象不是楼主提的问题。
    首先,全部文件是用HKEY_CLASSES_ROOT\* 表示的。
    其次,要使全部文件都有同样的菜单项,我所知道的有两种:
    一是在HKEY_CLASSES_ROOT\*\shell下添加命令项子键,再在其下层添加COMMAND子键,并写入命令行语句。
    二是在HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers下添加“子菜单”项子键,其默认值是如同"{B41DB860-8EE4-11D2-9906-E49FADC173CA}"这样的GUID,当然这个GUID也应该注册进注册表中。
    前者只是加入一个菜单项命令,而后者可以实现嵌入子菜单项。WINRAR的选项中就有设置“是否层叠右键菜单”,就是掌管切换这两种形式的。
      

  3.   

    RAR是用环境接口实现的,哪是你这样说的,老兄搞错了,仅写文件关联是不行的