我知道安装人员可以在安装过程中为您的应用程序设置文件关联,因此如果您有自己的应用程序打开的文件类型,则会设置这样做,并且关联的文件也会有自己的图标在Windows中定义的内容。
无论如何,我希望能够直接从我的应用程序中的首选项表单设置/删除我的应用程序将使用的文件类型。
需要采用哪些方法来实现这一点,我正在思考注册表,但是我们要使用哪些键/值等,如果注册表是要走的路?
欣赏一些建议和提示,它在XP / Vista / 7上也很重要。
先谢谢。
答案 0 :(得分:3)
尝试使用此单元将特定扩展名与exe关联,删除在注册表中进行的注销以取消注册。
unit utils;
interface
uses Registry, ShlObj, SysUtils, Windows;
procedure RegisterFileType(cMyExt, cMyFileType, cMyDescription, ExeName: string; IcoIndex: integer; DoUpdate: boolean = false);
implementation
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);
// Write my file type to it.
// This adds HKEY_CLASSES_ROOT\.abc\(Default) = 'Project1.FileType'
Reg.WriteString('', cMyFileType);
Reg.CloseKey;
// Now create an association for that file type
Reg.OpenKey(cMyFileType, True);
// This adds HKEY_CLASSES_ROOT\Project1.FileType\(Default)
// = 'Project1 File'
// This is what you see in the file type description for
// the a file's properties.
Reg.WriteString('', cMyDescription);
Reg.CloseKey; // Now write the default icon for my file type
// This adds HKEY_CLASSES_ROOT\Project1.FileType\DefaultIcon
// \(Default) = 'Application Dir\Project1.exe,0'
Reg.OpenKey(cMyFileType + '\DefaultIcon', True);
Reg.WriteString('', ExeName + ',' + IntToStr(IcoIndex));
Reg.CloseKey;
// Now write the open action in explorer
Reg.OpenKey(cMyFileType + '\Shell\Open', True);
Reg.WriteString('', '&Open');
Reg.CloseKey;
// Write what application to open it with
// This adds HKEY_CLASSES_ROOT\Project1.FileType\Shell\Open\Command
// (Default) = '"Application Dir\Project1.exe" "%1"'
// Your application must scan the command line parameters
// to see what file was passed to it.
Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True);
Reg.WriteString('', '"' + ExeName + '" "%1"');
Reg.CloseKey;
// Finally, we want the Windows Explorer to realize we added
// our file type by using the SHChangeNotify API.
if DoUpdate then SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
finally
Reg.Free;
end;
end;
end.
注册表是处理事物的方式......
答案 1 :(得分:3)
从您的应用中,您最好使用每用户存储来进行文件关联。如果使用系统范围的注册表位置,则需要提升才能应用更改。这不是你应该在标准用户应用程序中做的事情。
将注册表设置存储在:
下HKEY_CURRENT_USER\SOFTWARE\Classes
其下的条目格式与
完全相同HKEY_LOCAL_MACHINE\SOFTWARE\Classes
答案 2 :(得分:0)
您可以从shell运行以下命令 http://support.microsoft.com/kb/184082
或 您可以在注册表中创建条目,如以下链接所示 http://www.daycounter.com/LabBook/Changing-File-Associations-With-Registry-Editor.phtml