Как связать программу Delphi с типом файла, но только для текущего пользователя?

Итак, я не могу связать свою программу с определенным типом файла, не заставляя бедного пользователя вводить свой пароль администратора (это может быть хорошо для домашних пользователей, но это гигантская проблема для пользователей в корпоративном env). В этом случае единственным решением является объединение только для текущего пользователя.

Я пробовал это, но что-то не работает.

Если я правильно понимаю, мне нужно написать такой ключ, как (скажем), ".mp3" в ctCurUserFileExt и записать в нем что-то вроде "my_file". Затем в ctCurUserClases я добавляю такой ключ:

WriteReg_String(RootKey, ctCurUserClases+ 'my_file\shell\open\command', '', Application.ExeName+ ' "%L"', TRUE) 

Однако, когда я дважды щелкаю по файлу, Windows спрашивает, с каким приложением он должен его открыть.

Вот константа:

CONST
     RootKey= 'HKEY_CURRENT_USER';
     ctCurUserFileExt= '\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\';
     ctCurUserClases = '\Software\Classes\';

Ответ 1

Если вы хотите зарегистрировать ассоциацию для каждого пользователя, напишите свои данные в

HKEY_LOCAL_MACHINE\Software\Classes

Если вы хотите зарегистрировать ассоциацию только для текущего пользователя, напишите свои данные в

HKEY_CURRENT_USER\Software\Classes

Вот как это сделать:

with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKey('\Software\Classes\.myfile', true) then
      WriteString('', 'MyAppDataFile');
    if OpenKey('\Software\Classes\MyAppDataFile', true) then
      WriteString('', 'My Very Own Text File Type');
    if OpenKey('\Software\Classes\MyAppDataFile\DefaultIcon', true) then
      WriteString('', 'C:\WINDOWS\notepad.exe');
    if OpenKey('\Software\Classes\MyAppDataFile\shell\open\command', true) then
      WriteString('', 'C:\WINDOWS\notepad.exe "%1"');
  finally
    Free;
  end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);

Это будет связывать файлы .myfile, называемые "My Very Own Text File Type", чтобы они имели значок notepad.exe и будут открыты notepad.exe. В последней строке Explorer советует "перезагрузить" себя, чтобы отразить изменения, внесенные в ассоциации файлов. Например, просмотры списка файлов Explorer будут обновляться. Функция WinAPI SHChangeNotify объявлена ​​в ShlObj.pas, поэтому вам нужно uses ShlObj.

Обратите внимание, что %1 в shell\open\command будет расширяться до текущего файла. Например, если вы дважды щелкните по C:\some dir\test.myfile, тогда Explorer выполнит команду

C:\WINDOWS\notepad.exe "C:\some dir\test.myfile"