File Association - Pure Windows API

posted 16 Mar 2010, 06:44 by Delphi Basics   [ updated 16 Mar 2010, 06:58 ]
A file association associates a file with an application capable of opening that file. More commonly, a file association associates a class of files (usually determined by their filename extension, such as .txt) with a corresponding application (such as a text editor).

Read more: http://en.wikipedia.org/wiki/File_association

This function does not require the TRegistry unit to be added to the project since it uses pure Windows API.

{
    Coder: steve10120
    Compiled : Delphi 7
    Website: hackhound.org
}

function RegisterFileAssoc(Ext:string; sPath:string; sName:string; sDesc:string):Boolean;
var
  hOpen:  HKEY;
begin
  sName := sName + '.';
  Ext := UpperCase(Ext);
  if RegCreateKeyEx(HKEY_CLASSES_ROOT, PChar(sName + Ext), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hOpen, nil) = ERROR_SUCCESS then
  begin
    RegSetValueEx(hOpen, nil, 0, REG_SZ, PChar(sDesc), Length(sDesc));
    if RegCreateKeyEx(HKEY_CLASSES_ROOT, PChar(sName + Ext + '\DefaultIcon'), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hOpen, nil) = ERROR_SUCCESS then
    begin
      RegSetValueEx(hOpen, nil, 0, REG_SZ, PChar(sPath), Length(sPath));
      if RegCreateKeyEx(HKEY_CLASSES_ROOT, PChar(sName + Ext + '\shell\open\command'), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hOpen, nil) = ERROR_SUCCESS then
      begin
        sPath := '"' + sPath + '" "%1"';
        RegSetValueEx(hOpen, nil, 0, REG_SZ, PChar(sPath), Length(sPath));
        if RegCreateKeyEx(HKEY_CLASSES_ROOT, PChar('.' + Ext), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hOpen, nil) = ERROR_SUCCESS then
        begin
          RegSetValueEx(hOpen, nil, 0, REG_SZ, PChar(sName + Ext), Length(sName + Ext));
          CloseHandle(hOpen);
          if RegCreateKeyEx(HKEY_CURRENT_USER, PChar('Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'+LowerCase(Ext)), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hOpen, nil) = ERROR_SUCCESS then
          begin
            RegSetValueEx(hOpen, PChar('Progid'), 0, REG_SZ, PChar(sName + Ext), Length(sName + Ext));
            CloseHandle(hOpen);
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil) ;
          end;
        end;
      end;
    end;
  end;
end;


Usage
RegisterFileAssoc('xxx', ParamStr(0), 'Test', 'Test File');

Comments