我写了一个多媒体程序可以播放我自己定义的文件格式 .abc,
我的问题是如何实现:双击 .abc文件,自动打开程序播放它,
下面代码,可以实现关联,但如何才能播放它???
下面的代码可以实现.me和Notepad关联,Delphi如何实现文件关联
关联是Windows的一个显著特性。比如安装了office后,后缀是.doc的文
件会和word关联在一起。如果我们想自己创建关联关系,就必须从注册表入手。下
面的代码会把后缀是.me的文件和Notepad关联在一起,请参阅:procedure TForm1.Button1Click(Sender: TObject);
var
lphKey: HKEY;
sKeyName: string;
sKeyvalue: string;
begin
sKeyName := 'ReadMeFile';
sKeyvalue := '说明文档';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetvalue(lphKey, '', REG_SZ, pchar(sKeyvalue), 0);
sKeyName := '.me';
sKeyvalue := 'ReadMeFile';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetvalue(lphKey, '', REG_SZ, pchar(sKeyvalue), 0);
sKeyName := 'ReadMeFile';
sKeyvalue := 'c:\Win95\NotePad.exe %1'; { 注意路径 }
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetvalue(lphKey, 'shell\open\command', REG_SZ,
pchar(sKeyvalue), MAX_PATH);
end;
我的问题是如何实现:双击 .abc文件,自动打开程序播放它,
下面代码,可以实现关联,但如何才能播放它???
下面的代码可以实现.me和Notepad关联,Delphi如何实现文件关联
关联是Windows的一个显著特性。比如安装了office后,后缀是.doc的文
件会和word关联在一起。如果我们想自己创建关联关系,就必须从注册表入手。下
面的代码会把后缀是.me的文件和Notepad关联在一起,请参阅:procedure TForm1.Button1Click(Sender: TObject);
var
lphKey: HKEY;
sKeyName: string;
sKeyvalue: string;
begin
sKeyName := 'ReadMeFile';
sKeyvalue := '说明文档';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetvalue(lphKey, '', REG_SZ, pchar(sKeyvalue), 0);
sKeyName := '.me';
sKeyvalue := 'ReadMeFile';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetvalue(lphKey, '', REG_SZ, pchar(sKeyvalue), 0);
sKeyName := 'ReadMeFile';
sKeyvalue := 'c:\Win95\NotePad.exe %1'; { 注意路径 }
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetvalue(lphKey, 'shell\open\command', REG_SZ,
pchar(sKeyvalue), MAX_PATH);
end;
// 注册文件关联
// ExeName: 要检测的扩展名(例如: .txt)
// AppName: 要关联的应用程序名(例如: C:\StarTask\StarTask.exe)
// AppKey: ExeName扩展名在注册表中的键值(例如: txtfile)
// Icon: 扩展名为ExeName的图标文件(例如: C:\StarTask\Task.ico)
// Describe: 文件类型描述
void __fastcall RegisterFileRelation(AnsiString ExtName, AnsiString AppName,
AnsiString AppKey, AnsiString Icon, AnsiString Describe)
{
try
{
TRegistry *pReg = new TRegistry(); pReg->RootKey = HKEY_CLASSES_ROOT; // 打开主键 // 新建/打开以文件扩展名为名的项,并写入数据
pReg->OpenKey(ExtName, true);
pReg->WriteString("", AppKey);
pReg->CloseKey(); pReg->OpenKey(AppKey, true);
pReg->WriteString("", Describe);
pReg->CloseKey(); pReg->OpenKey(AppKey + "\\DefaultIcon", true);
pReg->WriteString("", Icon);
pReg->CloseKey(); pReg->OpenKey(AppKey + "\\shell", true);
pReg->WriteString("", "Open");
pReg->CloseKey(); pReg->OpenKey(AppKey + "\\shell\\Open\\Command", true);
pReg->WriteString("", + "\"" + AppName + "\" \"%1\"");
pReg->CloseKey(); delete pReg;
}
catch(...)
{
MessageBox(NULL, "注册文件关联时发生错误", "注意", MB_OK|MB_ICONWARNING);
}
}
begin
if ParamStr(1) <> '' then
begin
Play(ParamStr(1));
end;
end;
我按照楼上朋友的方法取ParamStr(1)的值,
已经可以播放我自定义格式的文件,但又有一个新问题:当文件路径名有空格时不行,
比如:我想打开一个文件:D:\E bak\123.abc
其中E和bak之间是空格,
这时ParamStr(1)得到的值是:D:\E
而不是完整的D:\E bak\123.abc请教如何解决呢?
var
I: Integer;
strFileName : string;
begin
strFileName := '';
for I := 1 to ParamCount do strFileName := strFileName + ' ' + ParamStr(I);
strFileName := Trim(strFileName);
//用自己的代码打开它Play(strFileName)
end;