Регистрация файловых ассоциаций в MFC не работает в Windows 7 - PullRequest
0 голосов
/ 09 декабря 2011

Эта проблема, которую я имею, очень легко воспроизвести. Создайте базовое приложение MFC MDI с расширением файла как .xyz, используя Visual Studio 2010. Код приложения по умолчанию легко регистрирует ассоциации файлов посредством вызовов:

 // Enable DDE Execute open
 EnableShellOpen();
 RegisterShellFileTypes(TRUE);

Проблема заключается в том, что внутри RegisterShellFileTypes (TRUE) сбой вызова ниже:

if (!_AfxSetRegKey(strFileTypeId, strFileTypeName))
   continue;       // just skip it

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

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Microsoft изменила свою концепцию регистрации расширения за эти годы.Начиная с Vista, ожидается, что расширение будет зарегистрировано во время установки с помощью приложения установки, которое будет иметь права администратора.Ключи реестра, необходимые для сопоставления расширения с приложением, теперь находятся в защищенной области реестра.То, о чем ты просишь, больше невозможно.

0 голосов
/ 14 сентября 2017

Как отметил Парапура Раджкумар, если вы поместите этот код в свой экземпляр init:

 // Enable DDE Execute open
 EnableShellOpen();
 RegisterShellFileTypes(TRUE);

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

0 голосов
/ 09 декабря 2011

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

// In your InitInstance, do the following:
OSVERSIONINFOEX osvi;
osvi.dwOSVersionInfoSize = sizeof OSVERSIONINFOEX;
GetVersionEx((OSVERSIONINFO*)&osvi);

if (osvi.dwMajorVersion >= 6) // XP or Vista/elevated?
{
    TCHAR exePath[MAX_PATH];
    GetModuleFileName(NULL, exePath, MAX_PATH);
    ShellExecute(NULL, _T("runas"), exePath, NULL, NULL, SW_SHOWNORMAL);
    return FALSE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...