关于文件类型关联的问题

yzsind 2005-06-10 05:44:43
请问如何将某种类型的文件与系统关联,比如像PDF文件系统会自动打开PDF阅读器,XLS文件会自动打开EXCEL,DOC文件会自动打开WORD等等,要求在IE中也会像EXCEL打开XLS一样的效果。
...全文
212 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
giveusomecolor 2005-06-18
  • 打赏
  • 举报
回复
帮你顶
~~
lovend 2005-06-10
  • 打赏
  • 举报
回复
帮你顶
Kshape 2005-06-10
  • 打赏
  • 举报
回复
文件关联的目的是要实现某种扩展名的文件由相应的应用程序来打开,对于编写的应用软件来说,由于一般都有设计者特定的扩展名的数据文件,软件编制者应在程序中实现自动关联而不能由用户手工去实现。下面给出实现文件关联的实用程序。

 实现文件关联的核心是对注册表的操作, 所有的文件关联都在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,然后双击它看是否是启动记事簿来打开的。
Kshape 2005-06-10
  • 打赏
  • 举报
回复
注册表文件关联

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

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

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

try

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

finally

reg.CloseKey;

end;

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

//create value where exefile is stored --> c:.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:.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+'','',icon);

// 写入缺省图标

myreg.writestring(key+'','',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 '', 'tstfile.exe,1'

打开命令,形为:

myprogram'', '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+'', 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 '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 '', Edit

testfile '', 'c:-e "%1"'



1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧