请问如何将某种类型的文件与系统关联,比如像PDF文件系统会自动打开PDF阅读器,XLS文件会自动打开EXCEL,DOC文件会自动打开WORD等等,要求在IE中也会像EXCEL打开XLS一样的效果。

解决方案 »

  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"'
     
       
      

  2.   

    文件关联的目的是要实现某种扩展名的文件由相应的应用程序来打开,对于编写的应用软件来说,由于一般都有设计者特定的扩展名的数据文件,软件编制者应在程序中实现自动关联而不能由用户手工去实现。下面给出实现文件关联的实用程序。 实现文件关联的核心是对注册表的操作, 所有的文件关联都在HKEY—CLASSES— ROOT 下面,要实现文件关联必须在HKEY—CLASSES—ROOT 中增加两个键值,一是和文件扩展名对应的类型说明,二是对这种类型文件的操作所需要执行的应用程序。下面举例说明,本例实现将扩展名为.xyz的文件定义为“我自己的文件”类型,双击此种类型的文件时执行的打开功能使用记事簿程序。 实现这一功能需要用到Delphi中的函数 RegCreateKey、RegSetValue。实现如下:  在窗体中放置一个按钮,双击按钮写如下代码:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     lphKey: HKEY;
     sKeyName: string;
     sKeyValue: string;
    begin
     sKeyName := 'myfile';
     sKeyValue := '我的文档';
     RegCreateKey(HKEY—CLASSES—ROOT, pchar(sKeyName), lphKey);
     RegSetValue(lphKey, '', REG—SZ, pchar(sKeyValue), 0);
     sKeyName := '.xyz';
     sKeyValue := 'myfile';
     RegCreateKey(HKEY—CLASSES—ROOT, pchar(sKeyName), lphKey);
     RegSetValue(lphKey, '', REG—SZ, pchar(sKeyValue), 0);
     sKeyName := 'myfile';
     sKeyValue := 'c:\Windows\NotePad.exe %1';//这里设置程序
     RegCreateKey(HKEY—CLASSES—ROOT, pchar(sKeyName), lphKey);
     RegSetValue(lphKey, 'shell\open\command', REG—SZ, pchar(sKeyValue), MAX—PATH);
    end; 建立一新文件,使其扩展名为.xyz,然后双击它看是否是启动记事簿来打开的。