Я пытаюсь настроить способ управления ассоциациями файлов для моей программы на C#. Я уже установил правильные значения в реестре с помощью WiX и нашел оболочку для ApplicationAssociationRegistrationUI, которая должна позволить мне открыть графический интерфейс для установки ассоциаций файлов. Но это не сработает. Я получаю следующее исключение: Элемент не найден. (Исключение из HRESULT: 0x80070490)LaunchAdvancedAssociationUI в C# -> Элемент не найден в Windows 8
Обертка:
namespace FileAssociation
{
[ClassInterface(ClassInterfaceType.None)]
[ComImport]
[Guid("1968106d-f3b5-44cf-890e-116fcb9ecef1")]
[TypeLibType(TypeLibTypeFlags.FCanCreate)]
public sealed class ApplicationAssociationRegistrationUI : IApplicationAssociationRegistrationUI
{
[MethodImpl(MethodImplOptions.InternalCall)]
public extern void LaunchAdvancedAssociationUI(string appRegistryName);
}
[CoClass(typeof(ApplicationAssociationRegistrationUI))]
[ComImport]
[Guid("1f76a169-f994-40ac-8fc8-0959e8874710")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[TypeLibImportClass(typeof(ApplicationAssociationRegistrationUI))]
public interface IApplicationAssociationRegistrationUI
{
void LaunchAdvancedAssociationUI([MarshalAs(UnmanagedType.LPWStr)] string appRegistryName);
}
}
Использование:
var assocUi = new ApplicationAssociationRegistrationUI();
try
{
assocUi.LaunchAdvancedAssociationUI(InstanceManager.ProgId);
}
catch
{
MessageBox.Show("Could not display the file association manager. Please repair the installation and try again.", "Error", MessageBoxButton.OK, MessageBoxImage.Warning);
}
finally
{
Marshal.ReleaseComObject(assocUi);
}
Опять же, все правильные ключи существуют в реестре. Это не первый раз, когда COM Interop терпит неудачу для меня, поэтому я начинаю думать, что я должен упустить что-то важное. Я попытался проверить «Регистрация для COM-взаимодействия» в свойствах проекта, и я попытался сделать его COM-видимым.
Я знаю, что это работает только на Vista или новее, что отлично, поскольку моя программа не поддерживает XP в любом случае. Я тестирую его на Windows 8.1, как в качестве администратора, так и в качестве обычного пользователя.
EDIT: Он работает на Windows 7! В MSDN не говорится, что этот API был устаревшим в Win8 ...
Что я сделал не так? Есть ли более простой способ сделать это, о котором я не знаю?