Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2013, 17:18   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
Вопрос Не регистрируются ассоциации файлов

Здравствуйте.
Пытаюсь зарегистрировать ассоциации файлов для своей программы. Пишу на Delphi 7 + WinAPI.
Код:
uses
  windows, shlobj;

function RegSetValue(RootKey: HKEY; Name: string; ValType: Cardinal; PVal:
  Pointer; ValSize: Cardinal): boolean;
var
  SubKey: string;
  n: integer;
  dispo: DWORD;
  hTemp: HKEY;
begin
  Result := False;
  n := LastPos('\', Name);
  if n > 0 then
  begin
    SubKey := Copy(Name, 1, n - 1);
    if RegCreateKeyEx(RootKey, PChar(SubKey), 0, nil, REG_OPTION_NON_VOLATILE,
      KEY_WRITE,
      nil, hTemp, @dispo) = ERROR_SUCCESS then
    begin
      SubKey := Copy(Name, n + 1, Length(Name) - n);
      Result := (RegSetValueEx(hTemp, PChar(SubKey), 0, ValType, PVal, ValSize)
        = ERROR_SUCCESS);
      RegCloseKey(hTemp);
    end;
  end;
end;

function RegSetString(const RootKey: HKEY; const key,ident,Value: string): boolean;
var
name : string;
begin
  name := key+'\'+ident;
  Result := RegSetValue(RootKey, Name, REG_SZ, PChar(Value + #0), Length(Value)+1);
end;


procedure SetAssoc(const Ext,exe,cmmd,descr : string);
begin
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext,'',ext+'file');
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext+'\OpenWithList\'+extractfilename(exe),'','');
  RegSetString(HKEY_CLASSES_ROOT,ext+'file','',descr);
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell','','ZeratoolOpen');
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell\ZeratoolOpen','',cmmd);
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell\ZeratoolOpen\command','',
                                     '"'+exe+'" "%1"');
end;

// вызов
SetAssoc('txt','Myexe.exe','Открыть666','Описалово');
          SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
Информация заносится в реестр, но продолжает действовать старая ассоциация.
Запуск от админа не помогает.
Что не так?
win7 x64
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.07.2013, 19:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Запуск от админа не помогает.
Перезагрузка тоже?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2013, 19:30   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Перезагрузка тоже?
Перезагрузка тоже не помогает.
помогает только ручное переназначение ассоциации через свойства файла.
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.07.2013, 19:47   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Кеш иконок надо просто перезагрузить. Это доп. фенька с 7ки пошла.

Последний раз редактировалось Человек_Борща; 27.07.2013 в 19:53.
Человек_Борща вне форума Ответить с цитированием
Старый 27.07.2013, 19:52   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
А информирует об этом систему, за вас, дядя Петя?
Код:

          SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
а это разве не оно?
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.07.2013, 20:12   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
а это разве не оно?
Не заметил. Извиняйте.
Кэш картинок надо перезагрузить. Хотя у меня это само происходило в момент уведомления. Может не так что-то делаете?
Человек_Борща вне форума Ответить с цитированием
Старый 27.07.2013, 20:31   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Кэш картинок надо перезагрузить.
как это сделать? Это поможет, даже если перезагрузка системы не помогает?
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Может не так что-то делаете?
а как еще-то?
BLACK_RAIN вне форума Ответить с цитированием
Старый 27.07.2013, 21:05   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
как это сделать? Это поможет, даже если перезагрузка системы не помогает?
Вот тут уже интересно. Вы явно не так регистрацию расширения делаете.

Как минимум запись в HKEY_CLASSES_ROOT - это не хорошо. Данная ветка реестра реально не существует вообще. её создает система и заносит туда все файловые ассоциации из HKEY_CURRENT_USER\Classes\ от всех учетных записей в системе.

Пробовали через обычный TRegistry?

Далее как минимум над так. А у вас ошибка.
Код:
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext,'',ext+'file');
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext+'\OpenWithList\'+extractfilename(exe),'','');
  RegSetString(HKEY_CLASSES_ROOT,ext+'file','',descr);
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell','','Open');
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell[B]\Open','',cmmd);
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell\Open\command','',
                                     '"'+exe+'" "%1"');
Человек_Борща вне форума Ответить с цитированием
Старый 28.07.2013, 07:43   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Как минимум запись в HKEY_CLASSES_ROOT - это не хорошо. Данная ветка реестра реально не существует вообще. её создает система и заносит туда все файловые ассоциации из HKEY_CURRENT_USER\Classes\ от всех учетных записей в системе.
Тогда куда реально система прописывает ассоциации? Я смотрел в редакторе реестра - у меня нет ветки HKEY_CURRENT_USER\Classes\.
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Пробовали через обычный TRegistry?
Хотелось бы обойтись только WinAPI-функциями.
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Далее как минимум над так. А у вас ошибка.
Сначала я так и делал. Оно несколько раз сработало (даже без вызова SHChangeNotify), а потом перестало.
p.s. Вроде разобрался.
Надо прописать изменение значения в ветке 'HKEY_CURRENT_USER\Software\Microso ft\Windows\CurrentVersion\Explorer\ FileExts\.'+ext.
Код:
function RegDelKey(RootKey: HKEY; Name: string): boolean;
var
  SubKey: string;
  n: integer;
  hTemp: HKEY;
begin
  Result := False;
  n := LastPos('\', Name);
  if n > 0 then
  begin
    SubKey := Copy(Name, 1, n - 1);
    hTemp := 0;
    if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS
      then
    begin
      SubKey := Copy(Name, n + 1, Length(Name) - n);
      Result := (RegDeleteKey(hTemp, PChar(SubKey)) = ERROR_SUCCESS);
      RegCloseKey(hTemp);
    end;
  end;
end;

function RegSetValue(RootKey: HKEY; Name: string; ValType: Cardinal; PVal:
  Pointer; ValSize: Cardinal): boolean;
var
  SubKey: string;
  n: integer;
  dispo: DWORD;
  hTemp: HKEY;
begin
  Result := False;
  n := LastPos('\', Name);
  if n > 0 then
  begin
    SubKey := Copy(Name, 1, n - 1);
    if RegCreateKeyEx(RootKey, PChar(SubKey), 0, nil, REG_OPTION_NON_VOLATILE,
      KEY_WRITE,
      nil, hTemp, @dispo) = ERROR_SUCCESS then
    begin
      SubKey := Copy(Name, n + 1, Length(Name) - n);
      Result := (RegSetValueEx(hTemp, PChar(SubKey), 0, ValType, PVal, ValSize)
        = ERROR_SUCCESS);
      RegCloseKey(hTemp);
    end;
  end;
end;

function RegSetString(const RootKey: HKEY; const key,ident,Value: string): boolean;
var
name : string;
begin
  name := key+'\'+ident;
  Result := RegSetValue(RootKey, Name, REG_SZ, PChar(Value + #0), Length(Value)+1);
end;

procedure SetAssoc(const Ext,exe,cmmd,descr : string);
const
  key = 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts';
begin
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext,'',ext+'file');
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext+'\OpenWithList\'+extractfilename(exe),'','');
  RegSetString(HKEY_CLASSES_ROOT,'.'+ext+'\OpenWithProgIds',ext+'file','');
  RegSetString(HKEY_CLASSES_ROOT,ext+'file','',descr);
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell','','Open');
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell\Open','',cmmd);
  RegSetString(HKEY_CLASSES_ROOT,ext+'file\shell\Open\command','',
                                     '"'+exe+'" "%1"');
  RegSetString(HKEY_CURRENT_USER,key+'\.'+ext+'\OpenWithProgids',ext+'file','');
  RegDelKey(HKEY_CURRENT_USER,key+'\.'+ext+'\UserChoice');
  RegSetString(HKEY_CURRENT_USER,key+'\.'+ext+'\UserChoice','Progid',ext+'file');
end;
Всем респект!

Последний раз редактировалось BLACK_RAIN; 28.07.2013 в 10:13.
BLACK_RAIN вне форума Ответить с цитированием
Старый 28.07.2013, 10:26   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
куда реально система прописывает ассоциации?
А вот на такие вопросы может ответить программа RegMon.
Рекомендую на будущее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассоциации файлов kzld Софт 0 06.01.2012 13:20
Ассоциации romanzi Общие вопросы Delphi 1 20.04.2011 21:25
Ассоциации romanzi Общие вопросы Delphi 5 17.04.2011 23:01
Ассоциации romanzi Общие вопросы Delphi 1 13.04.2011 22:59
ассоциации файлов dani92 Общие вопросы Delphi 3 26.04.2009 20:12