ccidnet????

出版日期:2000-01-10 总期号:891 本年期号:03

本期导读
要闻综合
电脑工作室
市场
硬件
软件
infotimes
用delphi实现文件关联

郑育洲

  文件关联为我们带来很多的方便。delphi自带有注册表对象tregistry,可以通过它取得或改变注册表相关键值的内容。

  function getassociatedexec(fileext: string; var filedescription, mimetype: string): string;

  var reg: tregistry; filetype: string;

  begin

   result := ′′;{函数返回值是打开fileext文件的可执行程序的名字及其参数}

   reg := tregistry.create;{创建注册表对象的实例}

   try

   reg.rootkey := hkey—classes—root;{准备操作的注册表根键}

   if not reg.openkey(fileext, false) then exit;{当传入的文件类型在注册表中不存在时退出,false表示fileext键值不存在时不自动创建新键}

   filetype := reg.readstring(′′);{文件类型的简单描述}

   mimetype := reg.readstring(′content type′);{内容mime类型}

   reg.closekey;{关闭当前关键字}

   if (filetype = ′′) or (not reg.openkey(filetype, false)) then exit;

   filedescription := reg.readstring(′′);{内容类型的具体描述}

   if not reg.openkey(′shell\open\command′, false) then exit;{该键值保存由哪个程序、以什么参数打开fileext类型的文件}

   result := reg.readstring(′′);{读取该键值内容}

   reg.closekey; finally

   reg.free;{释放对象实例}

   end; end;

  由上面的例程可知,首先在hkey—classes—root寻找与fileext(文件后缀,带“.”)相匹配的主键,然后从“默认” 键名取得键值,然后以该键值作为主键取得fileext的具体描述。在其子键shell\open\command中保存了由哪个程序、以什么参数打开fileext类型的文件的信息,只要修改它的内容,就可以控制由哪个程序打开fileext类型的文件。

  既然知道了文件关联在注册表中是如何定义的,只要反其道而行,就可以正确改变文件的关联了。

  function setassociatedexec(fileext, filetype, filedescription,mimetype,execname: string): boolean;{修改成功,返回true,否则false}

  var reg: tregistry;

  begin

   result := false;{}

   if (fileext = ′′) or (execname = ′′) then exit;{如果文件类型为空或者没有定义执行程序就退出,fileext必须带″.″,如.bmp}

   reg := tregistry.create;

   try

  reg.rootkey := hkey—classes—root;

  if not reg.openkey(fileext, true) then exit;{当不能正确找到或创建fileext键时退出,这种情况一般是注册表有错误,以下同}

  reg.writestring(′′, filetype);

  if mimetype <> ′′ then reg.writestring(′content type′, mimetype);

  reg.closekey;

  if not reg.openkey(filetype, true) then exit;

  reg.writestring(′′, filedescription);

  if not reg.openkey(′shell\open\command′, true) then exit;

  reg.writestring(′′, execname);{执行程序一般都有参数,例如winzip的“winzip32.exe ″%1″”,″%1″参数指zip文件的文件名。因此execname应视情况加入参数}

  reg.closekey;

   finally reg.free; end;

  end;

  写与读是一个性质相同、方向相反的过程,因此在setassociatedexec函数没有过多的说明,可以参考getassociatedexec函数。至于tregistry的使用,限于篇幅,本文从略。