2015-02-08 1 views
3

Я пытаюсь настроить способ управления ассоциациями файлов для моей программы на 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 ...

Что я сделал не так? Есть ли более простой способ сделать это, о котором я не знаю?

ответ

1

Наконец-то возникла проблема !!! Начиная с Windows 8, программа должна иметь информацию о компании (я думаю, что это ошибка, так как он не упоминается на сайте Microsoft.) Поэтому убедитесь, чтобы заполнить этот атрибут в AssemblyInfo.cs:

[assembly: AssemblyCompany("YourCompany")] 

Если это пустая строка, это не сработает!