比如我建立一个文本编辑器,保存文本时将当前编辑的文件保存为abc.def(注意它的扩展名不是txt的),我怎样才能实现这个文件和我这个程序的关联,也就是说当我在双击这个文件时,默认打开它的是我的这个文本编辑器。
如果有类似地程序也可以发到

解决方案 »

  1.   

    注册表文件关联    
        
    usesregistry, shlobj;procedure TForm1.RegisterFileType(prefix: string; exepfad: string);varreg: TRegistry;beginreg := TRegistry.Create;tryreg.RootKey := HKEY_CLASSES_ROOT;//create a new key --> .pcireg.OpenKey('.' + prefix, True);try//create a new value for this key --> pcifilereg.Writestring('', prefix + 'file');finallyreg.CloseKey;end;//create a new key --> pcifilereg.CreateKey(prefix + 'file');//create a new key pcifilereg.OpenKey(prefix + 'file', True);//and create a value where the icon is stored --> c:.exe,0tryreg.Writestring('', exepfad + ',0');finallyreg.CloseKey;end;reg.OpenKey(prefix + 'file', True);//create value where exefile is stored --> c:.exe "%1"tryreg.Writestring('', exepfad + ' "%1"');finallyreg.CloseKey;end;finallyreg.Free;end;SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);end; procedure TForm1.Button1Click(Sender: TObject);beginRegisterFileType('pci', 'c:.exe');end;*****************************************注意,在下面这些操作之后,应该发送一个刷新的消息给系统:SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);通过对注册表进行修改,可以删除一种文件名后缀与某个应用程序相关联程序例如下:procedure deregisterFileType(ft: String);//ft:将要删除文件关联的后缀,如.tstvarmyreg:TRegistry;key: String;beginmyreg:=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:文件后缀键值,如.tstvarmyReg:TRegistry;beginmyReg:=TRegistry.Create;myReg.RootKey:=HKEY_CLASSES_ROOT;if not myReg.KeyExists(ft) thenbeginMyReg.Free;Exit;end;MyReg.OpenKey(ft, true);if MyReg.KeyExists('ShellNew') thenMyReg.DeleteKey('ShellNew');MyReg.CloseKey;MyReg.Free;end;调用例子:Example:FileTDelNew('.tst');原理说明:将后缀键的下面的子键ShellNew删除即可。通过对注册表进行修改,可以删除资源管理器上下文件菜单中对某类文件的处理命令程序例如下:procedure FileTDelAction(key, name: String);//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile//name:命令名称varmyReg: TRegistry;beginmyReg:=TRegistry.Create;myReg.RootKey:=HKEY_CLASSES_ROOT;//如果给出的是一个文件后缀,则转换成对应的描述键值//在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的{ if key[1] = '.' thenkey:= copy(key,2,maxint)+'_auto_file';}if key[1] = '.' thenbeginif myReg.KeyExists(key) then //首先看注册表中是否有此键,有则取出beginmyReg.OpenKey(key, false);key:=myReg.ReadString ('');endelsekey:= copy(key,2,maxint)+'_auto_file';end;if key[Length(key)-1] <> ' thenkey:=key+';myReg.OpenKey('+key+'shell, true);if myReg.KeyExists(name) thenmyReg.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 begindelete(ft,ct,1);ct := pos('.',ft);end;if (ft = '') or (prg = '') then exit; //判断后缀及应用程序是否有效ft := '.'+ft;myreg := treginifile.create('');trymyreg.rootkey := hkey_classes_root; // 根应该为HKEY_CLASSES_ROOTif key = '' then key := copy(ft,2,maxint)+'_auto_file';// 如果没给出键值,则自动创建一个myreg.writestring(ft,'',key); // 写入描述的键值myreg.writestring(key,'',desc); // 写入描述if icon <> '' thenmyreg.writestring(key+'','',icon);// 写入缺省图标myreg.writestring(key+'','',prg+' "%1"');//写入相关联的应用程序finallymyreg.free;end;end;调用例子:Example:registerFileType('.tst','testfile','测试关联文件',Application.ExeName+',1',Application.ExeName);原理说明:程序关联的键值放在注册表根为HKEY_CLASSES_ROOT下面。实现文件关联要写入两个键值:后缀键值和描述键值(可用术语用的不对)如实现将.tst与程序tstfile.exe相关联其中后缀键值形为: .tst myprogramkey值为文件后缀,取值为对于key的一个描述描述键值形为: myprogram 文件描述其中还有相应的子键,如缺省的程序图标,形为:myprogram '', 'tstfile.exe,1'打开命令,形为:myprogram'', 'tstfile.exe "%1"'写入完这两个键值后就可以实现文件与应用程序相关联了。通过对注册表进行修改,可以在资源管理器上下文件菜单中的新建子菜单中增加新的命令程序例如下:typeTFileNewType = (ftNullFile, ftFileName, ftCommand);procedure FileTAddNew(ft, param: String; newType: TFileNewType);//fp:文件后缀键值,如.tst//param:传递参数//newType:新建的类型,有空文件, 文件名, 命令varmyReg:TRegistry;beginmyReg:=TRegistry.Create;myReg.RootKey:=HKEY_CLASSES_ROOT;if not myReg.KeyExists(ft) thenbeginMyReg.Free;Exit;end;myReg.OpenKey(ft+'', true);case NewType offtNullFile : 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 'NullFile', ''通过对注册表进行修改,可以在资源管理器上下文菜单中增加对某类文件的处理命令程序例如下:procedure FileTAddAction(key, name, display, action: String);//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile//name:命令名称//display:在上下文件菜单上显示的提示信息//action:对应的命令varmyReg:TRegistry;beginmyReg:=Tregistry.Create;myReg.RootKey:=HKEY_CLASSES_ROOT;if name='' then name:=display;//如果给出的是一个文件后缀,则转换成对应的描述键值//在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的{ if key[1] = '.' thenkey:= copy(key,2,maxint)+'_auto_file';}if key[1] = '.' thenbeginif myReg.KeyExists(key) then //首先看注册表中是否有此键,有则取出beginmyReg.OpenKey(key, false);key:=myReg.ReadString ('');endelsekey:= copy(key,2,maxint)+'_auto_file';end;if key[Length(key)-1] <> ' thenkey:=key+';if name[Length(name)-1] <> ' thenname:=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 '', Edittestfile '', 'c:-e "%1"'