轻松实现文件关联

软件世界

近日用Delphi编写了一个多媒体播放程序,有一个问题困扰了我很长时间,今天终于想出解决办法,好东东不敢独享,特介绍如下。
这个问题就是如何在双击一个文件的时候调用自己的程序来执行该文件?像《豪杰超级解霸》在打开一个媒体文件时系统会自动调用“解霸”来播放这个文件。以前通过观察,修改注册表,结果只是启动自己的程序,但不能播放刚双击的文件。
下面通过一个“文本编辑器”程序的编写向大家介绍其中的技巧。
其实如果双击一个文件,系统会作出反应,它首先会查找注册表,如果是已经注册的文件,系统会自动调用于打开该文件的程序。这个过程要有参数传递,其中传递的参数就是我们刚刚双击的文件名。如果我们的程序有了处理这个参数的功能,那么我们的程序便会打开刚双击的文件。

一、必要的知识准备

1.注册表操作

创建注册表键RegCreateKey();
它的函数为:RegCreateKey(hKey: HKEY; lpSubKey: PChar; var phkResult: HKEY)。
设置注册表键值:RegSetValue();
它的函数为:RegSetValue(hKey: HKEY; lpSubKey: PChar; dwType: DWORD; lpData: PChar; cbData: DWORD)

2.参数传递函数:

ParamStr(index:integer):string
function ParamStr(Index: Integer): string;
{$IFDEF MSWINDOWS}
var
P: PChar;
Buffer: array[0..260] of Char;
begin
Result:= '';
if Index = 0 then
SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer)))
else
begin
P:= GetCommandLine;
while True do
begin
P:= GetParamStr(P, Result);
if (Index = 0) or (Result = '') then Break;
Dec(Index);
end;
end;
{$ENDIF}
{$IFDEF LINUX}
begin
if Index < ArgCount then
Result:= PCharArray(ArgValues^)[Index]
else
Result:= '';
{$ENDIF}
end;

二、具体步骤

1.启动Delphi6.0

创建一个application。在主窗体上放置2个panel、4个speedbutton、1个opendialog和1个savedialog以及1个memo控件。
其中,4个speedbutton放在panel1上,memo1放在panel2上。设置Form1的bordericon中的bimaxmize为false,在icon中为Form1选择1个.ico图标。将4个speedbutton的name属性分别设置为btnreg、btnopen、btnsave、btnexit;将caption分别设置为:“注册文件类型”、“打开文件”、“保存文件”、“退出”。将cursor都设置为crHandPoint,4个speedbutton的falt属性设置为true,panel1的caption属性为空,color属性为clPurple(紫色),Align为alBottom,Panel2的caption为空,Align 为alClient。Memo1的Align 为 alClient,ScrollBars为ssBoth。因为要测试程序,故文件的扩展名应自定义,本文中使用hkx作为扩展名。Opendialog1和savedialog1的defaultext属性改为.hkx。
程序运行时如(图1)所示:

图1
图1

2.修改源代码

procedure TForm1.btnregClick(Sender: TObject);
var
regKey: HKEY;
regKeyName: string;
regKeyValue: string;
begin
regKeyName:= 'hkxtextfile';
regKeyValue:= '可学文本文件';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(regKeyName), regKey);
RegSetValue(regKey, '', REG_SZ, pchar(regKeyValue), 0);
regKeyName:= '.hkx';(文件扩展名)
regKeyValue:= '可学文本文件';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(regKeyName), regKey);
RegSetValue(regKey, '', REG_SZ, pchar(regKeyValue), 0);
regKeyName:= '可学文本文件';
regKeyValue:= 'c:\hkxsoft\hkxtext.exe %1'; ( 此处注意路径 )
RegCreateKey(HKEY_CLASSES_ROOT, pchar(regKeyName), regKey);
RegSetValue(regKey, 'shell\open\command', REG_SZ,pchar(regKeyValue), MAX_PATH);
RegCreateKey(HKEY_CLASSES_ROOT, pchar(regKeyName), regKey);
RegSetValue(regKey, 'defaulticon', REG_SZ, pchar('c:\hkxsoft\hkxtext.exe,0'), MAX_PATH);
end;
上面的代码用来注册一种新类型的文件,特别注意的是regKeyValue:= 'c:\hkxsoft\hkxtext.exe %1'中的'c:\hkxsoft\hkxtext.exe和%1,前者是绝对路径,即你的程序存放的位置,是固定的,如果想创建动态的键,就要使用其他WinApi函数此处请大家查阅Delphi的帮助文件。而1%则是一个参数,程序就是通过它来获取你到底双击的是哪个文件,它和下面的sFileName:= ParamStr(1);中的1对应。
下面的代码是在窗体创建之前由程序判断当前的参数情况,如果参数为空(即没有双击关联文件)则程序正常启动,如果参数不为空,则调用form1.Memo1.Lines.LoadFromFile(sfilename);来将文件中的内容读入到Memo1中。
procedure TForm1.FormCreate(Sender: TObject);
var
sFileName: string;
begin
form1.Timer1.Enabled:=true;
sFileName:= ParamStr(1); //读取系统参数,通过注册表%1传递!
if sFileName<>'' then //如果参数非空;
begin
form1.Memo1.Lines.LoadFromFile(sfilename);
end;
end;

3.程序其他部分的源代码

procedure TForm1.btnopenClick(Sender: TObject);
begin
if form1.OpenDialog1.Execute then
form1.Memo1.Lines.LoadFromFile(form1.OpenDialog1.FileName);
end;
procedure TForm1.btnsaveClick(Sender: TObject);
begin
if form1.SaveDialog1.Execute then
form1.Memo1.Lines.SaveToFile(form1.SaveDialog1.FileName );
end;
procedure TForm1.btnexitClick(Sender: TObject);
begin
application.Terminate;
end;
最后,如果有的朋友想编写一个播放多媒体文件的程序,笔者在此提出几点建议:
1.部分文件需要修改Win.ini文件和System.ini文件,根据笔者的经验,对*.mpeg、*.mp3、*.dat文件需要做以下修改:
在Win.ini的[mci extensions]节中加入以下代码:
mpg=mpegvideo
mp3=mpegvideo
dat=mpegvideo
在System.ini的[mci]节中加入MPEGVideo=mciqtz.drv(注意:此处的设备驱动程序因系统中所安装的设备不同而有可能不同)。
2.以上代码的加入可以通过编程实现:
procedure TForm1.FormCreate(Sender: TObject);
var
mysystem:tinifile;
mywin:tinifile;
begin
mysystem:=tinifile.Create ('c:\windows\system.ini');
mysystem.WriteString('mci','MPEGVideo','mciqtz.drv ');
mysystem.Free;
mywin:=tinifile.Create ('c:\windows\win.ini');
mywin.WriteString ('mci extensions','mpeg','mpegvideo');
mywin.WriteString ('mci extensions','mp3','mpegvideo');
mywin.WriteString ('mci extensions','dat','mpegvideo');
mywin.Free;
end;
其他部分参照2修改源代码中的例子修改即可!
好了,以上是笔者在编写程序时遇到的几个问题的解决方案,笔者学习编程也只有两年的时间,经验不足,希望借《电脑报》这块宝地抛砖引玉,但愿这个程序能给大家带来一点启发或收获,如果你有什么好的方法和经验还望不吝赐教,我的联系E-mail地址:houkexue@163.com
注:以上程序在Win98+Delphi6.0下测试通过。