如何处理应用程序中的文件关联?

时间:2011-07-15 08:11:00

标签: delphi file-association

我知道安装人员可以在安装过程中为您的应用程序设置文件关联,因此如果您有自己的应用程序打开的文件类型,则会设置这样做,并且关联的文件也会有自己的图标在Windows中定义的内容。

无论如何,我希望能够直接从我的应用程序中的首选项表单设置/删除我的应用程序将使用的文件类型。

需要采用哪些方法来实现这一点,我正在思考注册表,但是我们要使用哪些键/值等,如果注册表是要走的路?

欣赏一些建议和提示,它在XP / Vista / 7上也很重要。

先谢谢。

3 个答案:

答案 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