View Issue Details

IDProjectCategoryView StatusLast Update
0000961Far Manager 1.7xFile associationspublic2009-11-08 20:08
ReporterAriman Assigned Tovskirdin  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Fixed 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 19: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 10:06

administrator   bugnote:0003682

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

2009-07-08 18:50

 

far_fileext_check_patch_v2.diff (1,991 bytes)   
Index: execute.cpp
===================================================================
--- execute.cpp	(revision 3248)
+++ execute.cpp	(working copy)
@@ -200,21 +200,32 @@
 	if (!bVistaType)
 	{
 		HKEY hKey;
-		if (RegOpenKey(HKEY_CLASSES_ROOT,Ext,&hKey)!=ERROR_SUCCESS)
-			return false;
-		if(aType==AT_URLPROTOCOL)
+
+		// ���� ��� �� ��������� ���������, �� ������ �������� � ���. ����� ����������
+		if (aType == AT_FILEEXTENSION)
 		{
-			strType=Ext;
+			string strExplorerTypeKey(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\");
+			strExplorerTypeKey.Append(Ext);
+
+			if (RegOpenKey(HKEY_CURRENT_USER, strExplorerTypeKey, &hKey) == ERROR_SUCCESS)
+			{
+				RegQueryStringValue(hKey, L"ProgID", strType, L"");
+				RegCloseKey(hKey);
+			}
 		}
-		else
+		
+		if (strType.IsEmpty() && (RegOpenKey(HKEY_CLASSES_ROOT,Ext,&hKey) == ERROR_SUCCESS))
 		{
-			if (RegQueryStringValue(hKey,L"",strType,L"")!=ERROR_SUCCESS)
+			if(aType==AT_URLPROTOCOL)
 			{
-				RegCloseKey(hKey);
-				return false;
+				strType=Ext;
 			}
+			else
+			{
+				RegQueryStringValue(hKey,L"",strType,L"");
+			}
+			RegCloseKey(hKey);
 		}
-		RegCloseKey(hKey);
 	}
 
 	return !strType.IsEmpty();
Index: filetype.cpp
===================================================================
--- filetype.cpp	(revision 3248)
+++ filetype.cpp	(working copy)
@@ -325,22 +325,13 @@
 {
   string strValue;
   const wchar_t *ExtPtr;
-  HKEY hClassesKey;
 
   if ((ExtPtr=wcsrchr(Name,L'.'))==NULL)
     return(FALSE);
 
-	if (RegOpenKey(HKEY_CLASSES_ROOT,ExtPtr,&hClassesKey)!=ERROR_SUCCESS)
-      return(FALSE);
-
-/*
-  if (RegQueryStringValueEx(hClassesKey,L"",strValue)!=ERROR_SUCCESS)
-  {
-      RegCloseKey(hClassesKey);
-      return(FALSE);
-  }
-*/
-  RegCloseKey(hClassesKey);
+  string strType;
+  if (!GetShellType(ExtPtr, strType, AT_FILEEXTENSION))
+	  return(FALSE);
 
   string strFullName;
 

Ariman

2009-07-08 18:52

reporter   bugnote:0003691

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

vskirdin

2009-07-09 18: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 20:19

reporter   bugnote:0003697

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

Ariman

2009-07-09 20:24

reporter   bugnote:0003698

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

vskirdin

2009-07-10 08: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 08: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 09:39

 

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

alexy

2009-07-10 09:40

administrator   bugnote:0003701

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

vskirdin

2009-07-10 09:40

administrator   bugnote:0003702

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

> Ага?
Ага!

Ariman

2009-07-10 13:32

reporter   bugnote:0003703

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

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

vskirdin

2009-07-10 14:09

administrator   bugnote:0003704

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

DrKnS

2009-07-10 18:13

administrator   bugnote:0003705

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

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

vskirdin

2009-07-10 20:25

administrator   bugnote:0003706

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

DrKnS

2009-07-10 20:37

administrator   bugnote:0003707

Что "ЭТО"?

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

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

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

Ariman

2009-07-10 21:09

reporter   bugnote:0003708

Last edited: 2009-07-10 21:10

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

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

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

DrKnS

2009-07-10 21:22

administrator   bugnote:0003709

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

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


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

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

Ariman

2009-07-11 15:20

reporter   bugnote:0003713

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

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

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

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

vskirdin

2009-07-13 16:17

administrator   bugnote:0003719

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

2009-07-17 10:33

 

far_fileext_check_patch_v3.diff (4,318 bytes)   
Index: execute.cpp
===================================================================
--- execute.cpp	(revision 3280)
+++ execute.cpp	(working copy)
@@ -175,6 +175,72 @@
 	return Result;
 }
 
+bool IsProperProgID(const wchar_t* ProgID)
+{
+	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 false;
+}
+
+// ��� ������� ProgID �� ��������� ��������
+// hRootKey - �������� �� �� ������, ������ �� HKCR ��� HKCU
+// wszExtSubKey - �� ����� ��������� ��������
+// wszDefValueName - �� ���������� ���, ��� ������� �������� ID �� ������� �������� (����� NULL �� ������ � HKCR � ProgID �� HKCU)
+// strType - ��� ������� ��������, ���� ����� ������
+bool SearchExtHandlerProgID(HKEY hRootKey, const wchar_t* wszExtSubKey, const wchar_t* wszDefValueName, string &strType)
+{
+	HKEY hExtKey; 
+	
+	if (RegOpenKey(hRootKey, wszExtSubKey, &hExtKey) == ERROR_SUCCESS)
+	{
+		string strProgID;
+		if (RegQueryStringValue(hExtKey, wszDefValueName, strProgID) == ERROR_SUCCESS)
+			if (IsProperProgID(strProgID))
+			{
+				strType = strProgID;
+				RegCloseKey(hExtKey);
+				return true;
+			}
+
+		// ���� ��������� ������� �� ������� ��� �� ������ ����������������� ClassID � �������,
+		// ����� ������ ������ � �������� (��� ������ ��������� ����������� �� ������ Open with)
+		HKEY hExtIDListSubKey;
+		if (RegOpenKey(hExtKey, L"OpenWithProgids", &hExtIDListSubKey) == ERROR_SUCCESS)
+		{
+			DWORD nValueIndex = 0;
+			LONG nRet;
+			wchar_t wszValueName[64];
+			DWORD nValueNameSize = 64;
+			DWORD nValueType;
+
+			while ((nRet = RegEnumValue(hExtIDListSubKey, nValueIndex, wszValueName, &nValueNameSize, NULL, &nValueType, NULL, NULL)) != ERROR_NO_MORE_ITEMS)
+			{
+				if (nRet != ERROR_SUCCESS) break;
+				if ((nValueType == REG_SZ || nValueType == REG_NONE) && IsProperProgID(wszValueName))
+				{
+					strType = wszValueName;
+
+					RegCloseKey(hExtIDListSubKey);
+					RegCloseKey(hExtKey);
+					return true;
+				}
+				nValueIndex++;
+			}
+
+			RegCloseKey(hExtIDListSubKey);
+		}
+
+		RegCloseKey(hExtKey);
+	}
+	
+	return false;
+}
+
 bool GetShellType(const wchar_t *Ext, string &strType,ASSOCIATIONTYPE aType)
 {
 	bool bVistaType = false;
@@ -200,22 +266,16 @@
 
 	if (!bVistaType)
 	{
-		HKEY hKey;
-		if (RegOpenKey(HKEY_CLASSES_ROOT,Ext,&hKey)!=ERROR_SUCCESS)
-			return false;
-		if(aType==AT_URLPROTOCOL)
+		if (aType == AT_FILEEXTENSION)
 		{
-			strType=Ext;
-		}
-		else
-		{
-			if (RegQueryStringValue(hKey,L"",strType,L"")!=ERROR_SUCCESS)
-			{
-				RegCloseKey(hKey);
-				return false;
-			}
+			string strExplorerTypeKey(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\");
+			strExplorerTypeKey.Append(Ext);
+
+			SearchExtHandlerProgID(HKEY_CURRENT_USER, strExplorerTypeKey, L"ProgID", strType);
 		}
-		RegCloseKey(hKey);
+
+		if (strType.IsEmpty())
+			SearchExtHandlerProgID(HKEY_CLASSES_ROOT, Ext, NULL, strType);
 	}
 
 	return !strType.IsEmpty();
@@ -242,13 +302,6 @@
   	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";
 
Index: filetype.cpp
===================================================================
--- filetype.cpp	(revision 3280)
+++ filetype.cpp	(working copy)
@@ -325,22 +325,13 @@
 {
   string strValue;
   const wchar_t *ExtPtr;
-  HKEY hClassesKey;
 
   if ((ExtPtr=wcsrchr(Name,L'.'))==NULL)
     return(FALSE);
 
-	if (RegOpenKey(HKEY_CLASSES_ROOT,ExtPtr,&hClassesKey)!=ERROR_SUCCESS)
-      return(FALSE);
-
-/*
-  if (RegQueryStringValueEx(hClassesKey,L"",strValue)!=ERROR_SUCCESS)
-  {
-      RegCloseKey(hClassesKey);
-      return(FALSE);
-  }
-*/
-  RegCloseKey(hClassesKey);
+  string strType;
+  if (!GetShellType(ExtPtr, strType, AT_FILEEXTENSION))
+	  return(FALSE);
 
   string strFullName;
 

Ariman

2009-07-17 10:39

reporter   bugnote:0003750

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

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

vskirdin

2009-07-17 15:25

administrator   bugnote:0003753

Last edited: 2009-07-17 15: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 15:25

 

mpeg.rar (2,256 bytes)

Ariman

2009-07-17 15: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 15:54

administrator   bugnote:0003756

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

2009-07-20 11:06

 

far_fileext_check_patch_v4.diff (4,572 bytes)   
Index: execute.cpp
===================================================================
--- execute.cpp	(revision 3290)
+++ execute.cpp	(working copy)
@@ -175,6 +175,59 @@
 	return Result;
 }
 
+bool IsProperProgID(const wchar_t* ProgID)
+{
+	if (ProgID && *ProgID)
+	{
+		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 false;
+}
+
+// ��� ������� ProgID �� ��������� �������� �� ������ �������
+// hExtKey - �������� �� �� ������ (�� ��������)
+// strType - ��� ������� ��������, ���� ����� ������
+bool SearchExtHandlerFromList(HKEY hExtKey, string &strType)
+{
+	const DWORD dwNameBufSize = 64;
+
+	HKEY hExtIDListSubKey;
+	if (RegOpenKey(hExtKey, L"OpenWithProgids", &hExtIDListSubKey) == ERROR_SUCCESS)
+	{
+		DWORD nValueIndex = 0;
+		LONG nRet;
+		wchar_t wszValueName[dwNameBufSize];
+		DWORD nValueNameSize = dwNameBufSize;
+		DWORD nValueType;
+
+		// �������� �� ���� ������� � �������� ����� �� ������������� � ������� �����
+		while ((nRet = RegEnumValue(hExtIDListSubKey, nValueIndex, wszValueName, &nValueNameSize, NULL, &nValueType, NULL, NULL)) != ERROR_NO_MORE_ITEMS)
+		{
+			if (nRet != ERROR_SUCCESS) break;
+			if ((nValueType == REG_SZ || nValueType == REG_NONE) && IsProperProgID(wszValueName))
+			{
+				strType = wszValueName;
+
+				RegCloseKey(hExtIDListSubKey);
+				return true;
+			}
+
+			nValueIndex++;
+			nValueNameSize = dwNameBufSize;	// ������� ������� �� ������� ������� ������ (����� ������ ��� ����� ������ ������)
+		}
+
+		RegCloseKey(hExtIDListSubKey);
+	}
+	
+	return false;
+}
+
 bool GetShellType(const wchar_t *Ext, string &strType,ASSOCIATIONTYPE aType)
 {
 	bool bVistaType = false;
@@ -200,22 +253,42 @@
 
 	if (!bVistaType)
 	{
-		HKEY hKey;
-		if (RegOpenKey(HKEY_CLASSES_ROOT,Ext,&hKey)!=ERROR_SUCCESS)
-			return false;
-		if(aType==AT_URLPROTOCOL)
+		HKEY hCRKey = 0, hUserKey = 0;
+		string strFoundValue;
+		
+		if (aType == AT_FILEEXTENSION)
 		{
-			strType=Ext;
+			string strExplorerTypeKey(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\");
+			strExplorerTypeKey.Append(Ext);
+
+			// ������� �������� ��������� �������� � HKEY_CURRENT_USER
+			if (RegOpenKey(HKEY_CURRENT_USER, strExplorerTypeKey, &hUserKey) == ERROR_SUCCESS)
+				if ((RegQueryStringValue(hUserKey, L"ProgID", strFoundValue) == ERROR_SUCCESS) && IsProperProgID(strFoundValue))
+				{
+					strType = strFoundValue;
+				}
 		}
-		else
-		{
-			if (RegQueryStringValue(hKey,L"",strType,L"")!=ERROR_SUCCESS)
+
+		// ������� �������� ��������� �������� � HKEY_CLASSES_ROOT
+		if (strType.IsEmpty() && (RegOpenKey(HKEY_CLASSES_ROOT, Ext, &hCRKey) == ERROR_SUCCESS))
+			if ((RegQueryStringValue(hCRKey, L"", strFoundValue) == ERROR_SUCCESS) && IsProperProgID(strFoundValue))
 			{
-				RegCloseKey(hKey);
-				return false;
+				strType = strFoundValue;
 			}
+
+		if (strType.IsEmpty() && hUserKey)
+		{
+			SearchExtHandlerFromList(hUserKey, strType);
 		}
-		RegCloseKey(hKey);
+		if (strType.IsEmpty() && hCRKey)
+		{
+			SearchExtHandlerFromList(hCRKey, strType);
+		}
+
+		if (hUserKey)
+			RegCloseKey(hUserKey);
+		if (hCRKey)
+			RegCloseKey(hCRKey);
 	}
 
 	return !strType.IsEmpty();
@@ -242,13 +315,6 @@
   	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";
 
Index: filetype.cpp
===================================================================
--- filetype.cpp	(revision 3290)
+++ filetype.cpp	(working copy)
@@ -325,22 +325,13 @@
 {
   string strValue;
   const wchar_t *ExtPtr;
-  HKEY hClassesKey;
 
   if ((ExtPtr=wcsrchr(Name,L'.'))==NULL)
     return(FALSE);
 
-	if (RegOpenKey(HKEY_CLASSES_ROOT,ExtPtr,&hClassesKey)!=ERROR_SUCCESS)
-      return(FALSE);
-
-/*
-  if (RegQueryStringValueEx(hClassesKey,L"",strValue)!=ERROR_SUCCESS)
-  {
-      RegCloseKey(hClassesKey);
-      return(FALSE);
-  }
-*/
-  RegCloseKey(hClassesKey);
+  string strType;
+  if (!GetShellType(ExtPtr, strType, AT_FILEEXTENSION))
+	  return(FALSE);
 
   string strFullName;
 

Ariman

2009-07-20 11:09

reporter   bugnote:0003760

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

vskirdin

2009-07-20 15:32

administrator   bugnote:0003761

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

DiRTy_GaRRy

2009-07-20 16:32

developer   bugnote:0003763

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

vskirdin

2009-07-20 16:53

administrator   bugnote:0003764

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

DiRTy_GaRRy

2009-07-20 16:54

developer   bugnote:0003765

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

vskirdin

2009-07-20 17:00

administrator   bugnote:0003766

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

DiRTy_GaRRy

2009-07-20 17:45

developer   bugnote:0003769

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

Ariman

2009-07-20 18:58

reporter   bugnote:0003770

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

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

2009-07-20 19:38

 

pdf.rar (12,424 bytes)

DiRTy_GaRRy

2009-07-20 19:39

developer   bugnote:0003771

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

vskirdin

2009-07-21 09:42

administrator   bugnote:0003772

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

Ariman

2009-07-21 14:45

reporter   bugnote:0003775

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

DiRTy_GaRRy

2009-07-24 10:47

developer   bugnote:0003784

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

Ariman

2009-07-24 14:17

reporter   bugnote:0003787

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

vskirdin

2009-07-31 06:06

administrator   bugnote:0003829

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

Px

2009-07-31 09:03

reporter   bugnote:0003830

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

Ariman

2009-07-31 10: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 10:12

reporter   bugnote:0003831

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

vskirdin

2009-07-31 10:52

administrator   bugnote:0003832

build 1062

alexy

2009-11-03 19:20

administrator   bugnote:0004487

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

Ariman

2009-11-08 10:46

reporter   bugnote:0004526

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

DiRTy_GaRRy

2009-11-08 20:08

developer   bugnote:0004527

Last edited: 2009-11-08 20:09

View 2 revisions

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

Issue History

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