求救:文件关联相关问题…(88分)

  • 主题发起人 主题发起人 laohe
  • 开始时间 开始时间
L

laohe

Unregistered / Unconfirmed
GUEST, unregistred user!
我采用以下代码设计文件关联,测试通过,
1.但是注册完成后,不知道怎么样恢复,恢复文件原来默认的打开方式?
2.而且这个打开文件时,只能打开短文件名,不能打开有空格的长文件名(如:ABC for v0.1.mmd)

-----------------------------------------------
sKeyName := 'ReadMeFile';
sKeyValue := '音乐文件';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetValue(lphKey, '', REG_SZ, pchar(sKeyValue), 0);
sKeyName := '.mmd';//后缀名
sKeyValue := 'ReadMeFile';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetValue(lphKey, '', REG_SZ, pchar(sKeyValue), 0);
sKeyName := 'ReadMeFile';
sKeyValue :='c:/index.exe %1'; { 注意路径 }
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetValue(lphKey, 'shell/open/command', REG_SZ,
pchar(sKeyValue), MAX_PATH);
-----------------------------------------------------------------
 
只能供你参考。
文件类型的关联在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;
 
你会改,不会恢复,不是开玩笑吧,用同样的方法把它改回来就行了。
而打不开有空格的长文件名的问题,改善的方法是这样:

sKeyValue :='c:/index.exe %1'; { 注意路径 }
改成:
sKeyValue :='c:/index.exe "%1"'; { 注意路径 }
就没问题了。
 
:Slong你的建议太好了,可以方便地打开空格的长文件名的文件,谢谢,至于注册表已经可以了,当时是抓不到路径。
同时感谢guilinlzy的支持,
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
521
import
I
I
回复
0
查看
615
import
I
I
回复
0
查看
500
import
I
后退
顶部