打个比方,我有个自己编的记事本,然后自己定义了一种文件的扩展名,
请问怎么才能在我双击这个自定义扩展名的文件的时候自动打开的的程序并将文件中的内容读到程序中?

解决方案 »

  1.   

    to  lianshaohua(永远深爱一个叫“然”的好女孩儿!) 
    我也想知道具體如何做,大家可能都知道是通過注冊表實現的。
    能不能透點代碼出來呀。
      

  2.   

    以下程序摘抄,与本人无关,作者不祥,呵呵
    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;
      

  3.   

    调用例子:
     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"'
      

  4.   

    我的问题并不是文件关联,是在打开关联的文件的时候怎么能把文件中的内容读到
    就像Word一样,只要打开*.doc文件就会把Word打开然后文件的内容就会在Word上显示出来,
    我的问题就是怎么在打开文件时读到文件内容??
    我都晕死了!!!!!......../////
      

  5.   

    phy(被爱捶死) QQ号有吗?? 细谈如何??
      

  6.   

    可能是我的表达能力太差了
    大家为什么就是听不明白呢??!!打比方说:我编一个记事本,在注册表中加入扩展名.ywl,然后用户在编缉完文档后就保存为如 a.ywl ,
    然后有一天用户要打开这个名为 a.ywl 的文件查看,他肯定会双击此文件,然后操作系就会根据此类扩展名文件的关联信息运行我编的记事本程序,但是里面会显示这个文件的内容吗???.....