View Issue Details

IDProjectCategoryView StatusLast Update
0000961Far Manager 1.7xFile associationspublic2009-11-08 23:08
ReporterArimanAssigned Tovskirdin 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version 
Target VersionFixed in Version1.75 
Summary0000961: Неполная проверка на наличие файловых ассоциаций в реестре.
DescriptionНа данный момент проверка файлового расширения на наличие ассоциации с программой в реестре идет в ключе HKEY_CLASSES_ROOT. Но для эксплорера существует еще одна ветка, в которой прописаны расширения (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\). И некоторые программы прописываются только там.
При нажатии на таком файле в экслорере происходит запуск приписаной программы, а в фаре ничего не происходит. Что заставляет пользоваться командой start.

Функция запуска отрабатывает нормально с такими файлами, но облом идет раньше, на проверке ключа в реестре. Приложенный патч добавляет еще одну проверку в другом ключе, если первая проверка по HKEY_CLASSES_ROOT не прошла.

После патча Фар будет работать с внешними ассоциациями более сходно с эксплорером.
Additional InformationПримером программы с таим типом прописывания ассоциаций является XnView. Нестандартные типы файлов она в HKEY_CLASSES_ROOT не прописывает.
TagsNo tags attached.
Build1062

Activities

2009-07-03 22:03

 

far_fileext_check_patch.diff (730 bytes)
Index: .
===================================================================
--- .	(revision 3219)
+++ .	(working copy)
@@ -330,8 +330,14 @@
   if ((ExtPtr=wcsrchr(Name,L'.'))==NULL)
     return(FALSE);
 
-	if (RegOpenKey(HKEY_CLASSES_ROOT,ExtPtr,&hClassesKey)!=ERROR_SUCCESS)
-      return(FALSE);
+  	if (RegOpenKey(HKEY_CLASSES_ROOT,ExtPtr,&hClassesKey) != ERROR_SUCCESS)
+	{
+		string strExplorerTypeKey(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\");
+		strExplorerTypeKey.Append(ExtPtr);
+
+		if (RegOpenKey(HKEY_CURRENT_USER, strExplorerTypeKey, &hClassesKey) != ERROR_SUCCESS)
+			return(FALSE);
+	}
 
 /*
   if (RegQueryStringValueEx(hClassesKey,L"",strValue)!=ERROR_SUCCESS)

vskirdin

2009-07-08 13:06

administrator   bugnote:0003682

Не принимается - не полный патч
Hint: GetShellType, GetShellAction

2009-07-08 21:50

 

Ariman

2009-07-08 21:52

reporter   bugnote:0003691

Переделал. Теперь вроде все по феншую.
см. far_fileext_check_patch_v2.diff (первый файл теперь не актуален).

vskirdin

2009-07-09 21:05

administrator   bugnote:0003695

Вторая попытка. Неудачная.

У меня, например, в HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts есть ".mpeg", у него в подветке OpenWithProgids есть 2 значения: "mpegfile" и "mplayerc.mpeg". Причем в HCR значение "mplayerc.mpeg" отсутствует (есть только "mpegfile"). Но твой алгоритм хватает второй значение... что приводит к тому же сообщению об ошибке.
Надо бы усовершенствовать.

Ariman

2009-07-09 23:19

reporter   bugnote:0003697

Уточнение небольшое. Мой код в OpenWithProgids вообще не заходит. Я только дефолтные значения проверяю. Предлагаешь там тоже значения доставать?

Ariman

2009-07-09 23:24

reporter   bugnote:0003698

И что за сообщение возникает? По идее, если значение ProgID не существует, то GetShellAction выйдет дальше на проверке.

vskirdin

2009-07-10 11:34

administrator   bugnote:0003699

Хмм...
Для ".mpeg" у меня нет ProgID:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mpeg]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mpeg\OpenWithProgids]
"mpegfile"=hex(0):
"mplayerc.mpeg"=hex(0):


Но в тоже время "mplayerc.mpeg" - это значение по умолчанию в HCR (которого нет).

...может действительно добавить просмотр OpenWithProgids. И тот, кто первый откликнется (найдется в HCR) - того и отдавать.

Ariman

2009-07-10 11:59

reporter   bugnote:0003700

Так с HKCR значение и подтянулось, т.к. ProgID не было найдено. А что открывается, если жмакнуть на mpeg файле в эксплорере? Интересно, как он обрабатывает такие случаи.

Проверку по OpenWithProgids добавлю, не проблема. Т.е. останавливаемся на таком алгоритме:
1. [HKCU\...\Explorer\FileExts\.ext] ProgID
2. [HKCU\...\Explorer\FileExts\.ext] OpenWithProgids до первого попадания
3. [HKСR\.ext] дефолтное значение
4. [HKCR\.ext] OpenWithProgids до первого попадания
Ага?

2009-07-10 12:39

 

2009-07-10_123834.gif (10,820 bytes)
2009-07-10_123834.gif (10,820 bytes)

alexy

2009-07-10 12:40

administrator   bugnote:0003701

А я все ровно не понимаю зачем поддерживать расширения эксплорера. Системные расширения поддерживаются, зачем поддерживать ещё какую то левую прогу?

vskirdin

2009-07-10 12:40

administrator   bugnote:0003702

> А что открывается, если жмакнуть на mpeg файле в эксплорере?
картинку приаттачил

> Ага?
Ага!

Ariman

2009-07-10 16:32

reporter   bugnote:0003703

> А я все ровно не понимаю зачем поддерживать расширения эксплорера. Системные расширения поддерживаются, зачем поддерживать ещё какую то левую прогу?

Ну тут скорее поддержка еще целой кучи левых прог, которые регистрируются именно в этой ветке. Уж куда проще сделать эту поддержку в Фаре (благо не много работы), чем париться с каждой проблемной софтиной отдельно. Мешать то все равно не будет, а кому-то и поможет (как, например, мне).

vskirdin

2009-07-10 17:09

administrator   bugnote:0003704

alexy, ты не прав.
По крайней мере этот патч "вылечит" те неудобства, которые я испытываю иногда ;-)

DrKnS

2009-07-10 21:13

administrator   bugnote:0003705

Господа, а может ну его лесом, этот ручной шаманский анализ реестра?

Давайте делать, как все: sei.lpVerb = NULL - и вперёд.

vskirdin

2009-07-10 23:25

administrator   bugnote:0003706

а смысл, если ЭТО не пашет, по прихоти M$?

DrKnS

2009-07-10 23:37

administrator   bugnote:0003707

Что "ЭТО"?

MS прямым текстом рекомендует NULL использовать для выполнения дефолтного действия, и оно таки пашет.

А руками реестр читать, в котором формат поменяться может в любой момент - это очень большое кю.

С вистой уже проблемы поимели, с большой вероятностью поимеем ещё.

Ariman

2009-07-11 00:09

reporter   bugnote:0003708

Last edited: 2009-07-11 00:10

Использование NULL вместо поиска verb-а имеет смысл. Но еще вроде как есть кусок, определяющий гуевая прога прописана или нет.

Есть, правда, еще потенциальная альтернатива. AssocQueryString возвращает команду по verb-у. Можно выцепить путь к программе и проверить ее. Тогда, в сумме, парсинг реестра не понадобится.

Фича с OpenWithProgids естественно не получится, сама винда оттуда ничего не берет, если нет в дефолтных местах.

DrKnS

2009-07-11 00:22

administrator   bugnote:0003709

> Но еще вроде как есть кусок, определяющий гуевая прога прописана или нет.

Ага, я ждал этого вопроса :)
А теперь посчитайте, сколько у вас НЕГУЕВЫХ прог прописано в виндовых ассоциациях. Я вот почему-то такого чуда не видел ни разу.


> AssocQueryString возвращает команду по verb-у.

Это куда лучше, чем руками. Но, опять же, системные ассоциации - отнюдь не то место, где критически важно знать гуевость проги.

Ariman

2009-07-11 18:20

reporter   bugnote:0003713

> А теперь посчитайте, сколько у вас НЕГУЕВЫХ прог прописано в виндовых ассоциациях. Я вот почему-то такого чуда не видел ни разу.

Ну так на вскидку, интерпретатор питона. Это консольная программа. Но учитывая, что в этом случае стартует отдельная консоль, а не аттачится а фаровой, то это не особенно важно.

Вообще, я не отстаиваю идею проверки программы на гуевость. Я и так весьма смутно представляю назначение этого куска кода. Как и куска с поиском дефолтного verb-а. Но поскольку я не разработчик фара, то все предлагаемые патчи в основе несут идею "не сломать существующий функционал". Меня и ShellExecute с NULL вместо verb-а устроит, это фиксит проблему, ради которой создавался этот тикет. Но я же не могу предложить "давайте выкинем все что уже есть", писалось же это для чего-то.

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

vskirdin

2009-07-13 19:17

administrator   bugnote:0003719

таки предлагаю этот патч доделать.
он, по крайней мере, ничего не рушит.
а потом (как обычно лет через 100) будет смотреть что удалить/соптимизировать
Ariman, ты только немного откомментируй свой код, чтобы было понятно "на кой ляд это нужно"

2009-07-17 13:33

 

Ariman

2009-07-17 13:39

reporter   bugnote:0003750

Подправил патч с учетом пожеланий.

Я тут между делом посмотрел на тему оптимизации все этого хозяйства. И таки можно удалить много ненужного кода (в том числе и того, что я в патче добавил :) ) и избавиться от ручного просмотра реестра. С сохранением всего функционала. Но вылез небольшой конфликт с другим существующим кодом. Тут надо бы обсудить изменения с авторским коллективом (надо кое-что изменить будет). Дайте знать, если это вам интересно.

vskirdin

2009-07-17 18:25

administrator   bugnote:0003753

Last edited: 2009-07-17 18:25

что-то не прет...

1. Комп навернулся, перезалил (читай, "чистый")
2. Попробовал патч - работает (вызываем M$ выигрыватель)
3. Поставил медиаплейеркласик и сказал ему "mpeg ассоциируй на себя"
4. Explorer на mpeg-файле запустил (как и положено) mplayerc.exe
5. FAR сказал "неа":

  No application is associated with the specified
            file for this operation
                Cannot execute
         C:\movie\tcp-ip-protocol.mpeg

В аттаче (mpeg.rar) кусок реестра...

2009-07-17 18:25

 

mpeg.rar (2,256 bytes)

Ariman

2009-07-17 18:52

reporter   bugnote:0003755

Тут, кстати, выползает небольшой нюанс выбранного алгоритма поиска. Фар запустит M$-совский плеер. Т.к. в HKCU ассоциации нет, но список OpenWithProgids есть, а там первым идет тип от стандартного виндового плеера.
Эксплорер в этот список совсем не смотрит и перескочит на HKEY_CLASSES_ROOT, где уже прописан классик. Может имеет смысл поменять порядок обхода на
1. [HKCU\...\Explorer\FileExts\.ext] ProgID
2. [HKСR\.ext] дефолтное значение
3. [HKCU\...\Explorer\FileExts\.ext] OpenWithProgids до первого попадания
4. [HKCR\.ext] OpenWithProgids до первого попадания
?
Чтобы хотябы открывало с эксплорером одну программу, а не разные.

vskirdin

2009-07-17 18:54

administrator   bugnote:0003756

давай так попробуем :-)
на счет "хозяйства" чуть погодя поговорим...

2009-07-20 14:06

 

Ariman

2009-07-20 14:09

reporter   bugnote:0003760

Продолжаем стремление к прогрессу (far_fileext_check_patch_v4.diff) :)
Поменял порядок просмотра + пофиксил баг с обходом списка.

vskirdin

2009-07-20 18:32

administrator   bugnote:0003761

хмм... это уже лучше :-)
build 1052

DiRTy_GaRRy

2009-07-20 19:32

developer   bugnote:0003763

Ariman, может ты уж заодно попробуешь сделать что бы pdf-ы из фара-а нормально открывались в Adobe Reader-е при наличии на машине Adobe Acrobat-а? А то там хитрый shell extension.

vskirdin

2009-07-20 19:53

administrator   bugnote:0003764

DiRTy_GaRRy, я так понимаю, что это в тему про "остальное хозяйство".

DiRTy_GaRRy

2009-07-20 19:54

developer   bugnote:0003765

vskirdin, очень на это надеюсь, так как уж очень надоело.

vskirdin

2009-07-20 20:00

administrator   bugnote:0003766

DiRTy_GaRRy, хмм... тут подумалось... а разве в 1052 ОНО не пашет?
если нет - покажи куски реестра...

DiRTy_GaRRy

2009-07-20 20:45

developer   bugnote:0003769

Не пашет. Что конкретно показать?

Ariman

2009-07-20 21:58

reporter   bugnote:0003770

2 DiRTy_GaRRy.
Тут есть приаттаченый файл mpeg.rar. Вот нужно то же самое, но для pdf-а.

2 vskirdin
Зря ты меня с contributors добавил. Я там уж есть выше по списку, под реальными данными. :)

2009-07-20 22:38

 

pdf.rar (12,424 bytes)

DiRTy_GaRRy

2009-07-20 22:39

developer   bugnote:0003771

Сделал + скрин конекстного меню.

vskirdin

2009-07-21 12:42

administrator   bugnote:0003772

> Зря ты меня с contributors добавил. Я там уж есть выше по списку, под реальными данными.
в следующем патче удалю ;-)

Ariman

2009-07-21 17:45

reporter   bugnote:0003775

2 DiRTy_GaRRy
Это скорее на Shell Extension похоже, судя по данным с реестра. Ассоциация таки на сам Acrobat прописана. Похоже тут поможет только та самая тема про "остальное хозяйство" :) Попробуй дернуть ShellExecute на любом pdf-е с NULL вместо verb-a. Если откроется ридер, то будем знать точно как лечить.

DiRTy_GaRRy

2009-07-24 13:47

developer   bugnote:0003784

Да, дайствительно, если в lpOperation передавать null, то открывается Reader, а если open, то Acrobat.

Ariman

2009-07-24 17:17

reporter   bugnote:0003787

Ну тогда надо сделать то, о чем упоминал DrKnS выше, т.е. выкинуть ручной поиск дефолтного верба и ставить всегда NULL. Это решит проблему, да и код красивее станет :). Господа разработчики, тут уж слово за вами.

vskirdin

2009-07-31 09:06

administrator   bugnote:0003829

"В копилку" :-)
http://forum.farmanager.com/viewtopic.php?f=9&t=4333&start=0

Px

2009-07-31 12:03

reporter   bugnote:0003830

В своё время была та же проблема с плагином Smart Launch (http://forum.farmanager.com/viewtopic.php?p=15753#p15753), после установки NULL всё нормально работает уже несколько лет...

Ariman

2009-07-31 13:10

reporter  

far_lnk_patch.diff (773 bytes)
Index: .
===================================================================
--- .	(revision 3317)
+++ .	(working copy)
@@ -182,9 +182,8 @@
 		HKEY hProgID;
 		if (RegOpenKey(HKEY_CLASSES_ROOT, ProgID, &hProgID) == ERROR_SUCCESS)
 		{
-			int nResult = RegQueryValueEx(hProgID, L"IsShortcut", NULL, NULL, NULL, NULL);
 			RegCloseKey(hProgID);
-			return (nResult != ERROR_SUCCESS);
+			return true;
 		}
 	}
 	return false;
@@ -315,6 +314,13 @@
   	return NULL;
 
 	HKEY hKey;
+	if(RegOpenKeyEx(HKEY_CLASSES_ROOT,strValue,0,KEY_QUERY_VALUE,&hKey)==ERROR_SUCCESS)
+	{
+		int nResult=RegQueryValueEx(hKey,L"IsShortcut",NULL,NULL,NULL,NULL);
+		RegCloseKey(hKey);
+		if(nResult==ERROR_SUCCESS)
+			return NULL;
+	}
 
   strValue += L"\\shell";
 
far_lnk_patch.diff (773 bytes)

Ariman

2009-07-31 13:12

reporter   bugnote:0003831

Починил косяк с .lnk файлами (far_lnk_patch.diff). Одно из изменений в предыдущем патче оказалось не удачным :(

vskirdin

2009-07-31 13:52

administrator   bugnote:0003832

build 1062

alexy

2009-11-03 22:20

administrator   bugnote:0004487

Это уже исправлено?

Ariman

2009-11-08 13:46

reporter   bugnote:0004526

> Это уже исправлено?
Да, работает как и хотелось. А раз вопрос с причесыванием кода завял, то можно, наверное, закрывать.

DiRTy_GaRRy

2009-11-08 23:08

developer   bugnote:0004527

Last edited: 2009-11-08 23:09

View 2 revisions

Ну мой баг с pdf так и не исправлен.

Issue History

Date Modified Username Field Change
2009-07-03 22:03 Ariman New Issue
2009-07-03 22:03 Ariman File Added: far_fileext_check_patch.diff
2009-07-08 13:05 vskirdin Status new => assigned
2009-07-08 13:05 vskirdin Assigned To => vskirdin
2009-07-08 13:06 vskirdin Note Added: 0003682
2009-07-08 21:50 Ariman File Added: far_fileext_check_patch_v2.diff
2009-07-08 21:52 Ariman Note Added: 0003691
2009-07-09 21:05 vskirdin Note Added: 0003695
2009-07-09 23:19 Ariman Note Added: 0003697
2009-07-09 23:24 Ariman Note Added: 0003698
2009-07-10 11:34 vskirdin Note Added: 0003699
2009-07-10 11:59 Ariman Note Added: 0003700
2009-07-10 12:39 vskirdin File Added: 2009-07-10_123834.gif
2009-07-10 12:40 alexy Note Added: 0003701
2009-07-10 12:40 vskirdin Note Added: 0003702
2009-07-10 16:32 Ariman Note Added: 0003703
2009-07-10 17:09 vskirdin Note Added: 0003704
2009-07-10 21:13 DrKnS Note Added: 0003705
2009-07-10 23:25 vskirdin Note Added: 0003706
2009-07-10 23:37 DrKnS Note Added: 0003707
2009-07-11 00:09 Ariman Note Added: 0003708
2009-07-11 00:10 Ariman Note Edited: 0003708
2009-07-11 00:22 DrKnS Note Added: 0003709
2009-07-11 18:20 Ariman Note Added: 0003713
2009-07-13 19:17 vskirdin Note Added: 0003719
2009-07-17 13:33 Ariman File Added: far_fileext_check_patch_v3.diff
2009-07-17 13:39 Ariman Note Added: 0003750
2009-07-17 18:25 vskirdin Note Added: 0003753
2009-07-17 18:25 vskirdin File Added: mpeg.rar
2009-07-17 18:25 vskirdin Note Edited: 0003753
2009-07-17 18:52 Ariman Note Added: 0003755
2009-07-17 18:54 vskirdin Note Added: 0003756
2009-07-20 14:06 Ariman File Added: far_fileext_check_patch_v4.diff
2009-07-20 14:09 Ariman Note Added: 0003760
2009-07-20 18:32 vskirdin Note Added: 0003761
2009-07-20 18:32 vskirdin Status assigned => feedback
2009-07-20 19:32 DiRTy_GaRRy Note Added: 0003763
2009-07-20 19:53 vskirdin Note Added: 0003764
2009-07-20 19:54 DiRTy_GaRRy Note Added: 0003765
2009-07-20 20:00 vskirdin Note Added: 0003766
2009-07-20 20:45 DiRTy_GaRRy Note Added: 0003769
2009-07-20 21:58 Ariman Note Added: 0003770
2009-07-20 22:38 DiRTy_GaRRy File Added: pdf.rar
2009-07-20 22:39 DiRTy_GaRRy Note Added: 0003771
2009-07-21 12:42 vskirdin Note Added: 0003772
2009-07-21 17:45 Ariman Note Added: 0003775
2009-07-24 13:47 DiRTy_GaRRy Note Added: 0003784
2009-07-24 17:17 Ariman Note Added: 0003787
2009-07-31 09:06 vskirdin Note Added: 0003829
2009-07-31 12:03 Px Note Added: 0003830
2009-07-31 13:10 Ariman File Added: far_lnk_patch.diff
2009-07-31 13:12 Ariman Note Added: 0003831
2009-07-31 13:52 vskirdin Note Added: 0003832
2009-11-03 22:20 alexy Note Added: 0004487
2009-11-08 13:46 Ariman Note Added: 0004526
2009-11-08 19:32 alexy Build => 1062
2009-11-08 19:32 alexy Status feedback => closed
2009-11-08 19:32 alexy Fixed in Version => 1.75
2009-11-08 19:32 alexy Resolution open => fixed
2009-11-08 23:08 DiRTy_GaRRy Note Added: 0004527
2009-11-08 23:09 DiRTy_GaRRy Note Edited: 0004527 View Revisions