C# 中的 LaunchAdvancedAssociationUI -> 在 Windows 8 上找不到元素
LaunchAdvancedAssociationUI in C# -> Element not found on Windows 8
我正在尝试设置一种方法来管理我在 C# 中的程序的文件关联。我已经使用 WiX 在注册表中设置了正确的值,并找到了 ApplicationAssociationRegistrationUI 的包装器,它应该允许我打开 GUI 来设置文件关联。但它不起作用。我收到以下异常:找不到元素。 (HRESULT 异常:0x80070490)
包装器:
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 惨败,所以我开始认为我一定遗漏了一些重要的东西。我尝试在项目属性中检查 "Register for COM Interop",并尝试将其设置为 COM-Visible。
我知道这只适用于 Vista 或更新版本,这很好,因为我的程序无论如何都不支持 XP。我正在 Windows 8.1 上以管理员和普通用户身份对其进行测试。
编辑:它适用于 Windows 7!在 MSDN 上,它并没有说这个 API 在 Win8 中被弃用了...
我做错了什么?有没有我不知道的更简单的方法?
终于找到问题了!!!
从 Windows 8 开始,程序需要有公司信息(我认为这是一个错误,因为微软的网站上没有提到它。)
所以一定要在AssemblyInfo.cs中填写这个属性:
[assembly: AssemblyCompany("YourCompany")]
如果是空字符串就不行!
我正在尝试设置一种方法来管理我在 C# 中的程序的文件关联。我已经使用 WiX 在注册表中设置了正确的值,并找到了 ApplicationAssociationRegistrationUI 的包装器,它应该允许我打开 GUI 来设置文件关联。但它不起作用。我收到以下异常:找不到元素。 (HRESULT 异常:0x80070490)
包装器:
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 惨败,所以我开始认为我一定遗漏了一些重要的东西。我尝试在项目属性中检查 "Register for COM Interop",并尝试将其设置为 COM-Visible。
我知道这只适用于 Vista 或更新版本,这很好,因为我的程序无论如何都不支持 XP。我正在 Windows 8.1 上以管理员和普通用户身份对其进行测试。
编辑:它适用于 Windows 7!在 MSDN 上,它并没有说这个 API 在 Win8 中被弃用了...
我做错了什么?有没有我不知道的更简单的方法?
终于找到问题了!!! 从 Windows 8 开始,程序需要有公司信息(我认为这是一个错误,因为微软的网站上没有提到它。) 所以一定要在AssemblyInfo.cs中填写这个属性:
[assembly: AssemblyCompany("YourCompany")]
如果是空字符串就不行!