文件关联是如何实现的?

airhand 2003-08-30 05:28:21
我自己写了个应用程序,可以打开自己定义的文件格式,现在在实现一般的文件关联后,我想知道如何将我双击的文件名作为参数传递给我的程序并让它打开文件?就象双击DOC文件会启动WORD并打开文件一样.请高手指点!
...全文
37 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
airhand 2003-10-20
  • 打赏
  • 举报
回复
这个帖子发出很久了,一直没有得到答案,各位帮帮忙!
我自己写的AAA.EXE关联扩展名为.abc的文件后,双击.abc文件后应该打开我的AAA.EXE,请问如果AAA.EXE文件中有一个EDIT控件,如何能在启动后就在EDIT控件里面显示双击的文件名路径?
这涉及到带参数的EXE文件如何处理的问题,我不知道如何实现。
多写各位!100分送上!
airhand 2003-10-20
  • 打赏
  • 举报
回复
TO:kuangning(郎之间)
我试试看,非常感谢,好用送分!
kuangning 2003-10-20
  • 打赏
  • 举报
回复
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form1.edit1.Text := ParamStr(1);
Application.Run;
end.
airhand 2003-10-20
  • 打赏
  • 举报
回复
如何能在启动后就在EDIT控件里面显示双击的文件名路径?
dickeybird888 2003-10-20
  • 打赏
  • 举报
回复
文件类型的关联在Windows 95以后都是通过注册表来实现的,所以只能从写注册表入手。
注册表设置完毕后并不能立刻生效,需要调用API函数SHChangeNotify通知系统本应用程序已经执行,需要系统更新Shell。

procedure RegisterFileType(cMyExt,cMyFileType,cMyDescription,ExeName:string;
IcoIndex:integer;
DoUpdate:boolean=false);
var
Reg: TRegistry;
begin
Reg:=TRegistry.Create;
try
Reg.RootKey:=HKEY_CLASSES_ROOT;
Reg.OpenKey(cMyExt, True);
//写入自定义文件后缀
Reg.WriteString('', cMyFileType);
Reg.CloseKey;
//写入自定义的文件类型
//格式为:HKEY_CLASSES_ROOT\cMyExt\(Default) = 'cMyFileType'

//下面为该文件类型创建关联
Reg.OpenKey(cMyFileType, True);
Reg.WriteString('', cMyDescription);
//写入文件类型的描述信息
Reg.CloseKey;

// 下面为自定义文件类型选择图标
// 加入键格式为 HKEY_CLASSES_ROOT\cMyFileType\DefaultIcon
// \(Default) = 'Application Dir\Project1.exe,0'
Reg.OpenKey(cMyFileType + '\DefaultIcon', True);
Reg.WriteString('', ExeName + ',' + IntToStr(IcoIndex));
Reg.CloseKey;

// 下面注册在资源管理器中打开文件的程序
Reg.OpenKey(cMyFileType + '\Shell\Open', True);
Reg.WriteString('', '&Open');
Reg.CloseKey;

// 格式:HKEY_CLASSES_ROOT\Project1.FileType\Shell\Open\Command
// (Default) = '"Application Dir\Project1.exe" "%1"'
Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True);
Reg.WriteString('', '"' + ExeName + '" "%1"');
Reg.CloseKey;

//最后,让资源管理器实现我们加入的文件类型,只需调用SHChangeNotify即可
if DoUpdate then SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
finally
Reg.Free;
end;
end;
dickeybird888 2003-10-20
  • 打赏
  • 举报
回复
(·¥·)
airhand 2003-09-07
  • 打赏
  • 举报
回复
ParamStr(1)在哪里获得并处理?
RamjetZhang 2003-09-01
  • 打赏
  • 举报
回复
楼上of楼上:这样好象还没有图标
kuangning 2003-09-01
  • 打赏
  • 举报
回复
楼上说得建立关联是对的,然后你的程序中处理就是了ParamStr(1)就是双击的文件名称
lxpbuaa 2003-09-01
  • 打赏
  • 举报
回复
procedure SetFileOpener(FileKind, FileDescription, FileExt, OpenerPath: String);
如 //SetFileOpener('xyz文件', 'xyz文件类型', '.xyz', 'd:\winnt\NOTEPAD.EXE');
var
lphKey: HKEY;
begin
RegCreateKey(HKEY_CLASSES_ROOT, PChar(FileKind), lphKey);
RegSetValue(lphKey, '', REG_SZ, PChar(FileDescription), Length(FileDescription));
RegCreateKey(HKEY_CLASSES_ROOT, PChar(FileKind), lphKey);
RegSetValue(lphKey, 'shell\open\command', REG_SZ, PChar(OpenerPath), Length(OpenerPath));
RegCreateKey(HKEY_CLASSES_ROOT, PChar(FileExt), lphKey);
RegSetValue(lphKey, '', REG_SZ, PChar(FileKind), Length(FileKind));
end;

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
airhand 2003-09-01
  • 打赏
  • 举报
回复
没人会吗?
airhand 2003-08-31
  • 打赏
  • 举报
回复
我不是和记事本连接,我是和自己的程序关联并打开!
这个例子我早就看过了!请看清题意!
76liujing 2003-08-30
  • 打赏
  • 举报
回复

  在窗体中放置一个按钮,双击按钮写如下代码:
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,然后双击它看是否是启动记事簿来打开的。

hzw008 2003-08-30
  • 打赏
  • 举报
回复
在注册表加入要关联的信息。
nyf1220 2003-08-30
  • 打赏
  • 举报
回复
是不是在run底下的parameter底下进行设置参数?

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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