Как переписать регистрационный код Windows App SDK WidgetProvider с помощью генерации исходного кода ComWrappers?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как переписать регистрационный код Windows App SDK WidgetProvider с помощью генерации исходного кода ComWrappers?

Сообщение Anonymous »

Для приложений Windows App SDK для предоставления виджетов Windows необходимо написать код взаимодействия COM в соответствии с официальной документацией: реализовать фабрику классов, которая будет создавать экземпляр WidgetProvider по запросу.

Код: Выделить всё

// FactoryHelper.cs

using Microsoft.Windows.Widgets.Providers;
using System.Runtime.InteropServices;
using WinRT;

namespace COM
{
static class Guids
{
public const string IClassFactory = "00000001-0000-0000-C000-000000000046";
public const string IUnknown = "00000000-0000-0000-C000-000000000046";
}

///
/// IClassFactory declaration
///
[ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(COM.Guids.IClassFactory)]
internal interface IClassFactory
{
[PreserveSig]
int CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject);
[PreserveSig]
int LockServer(bool fLock);
}

[ComVisible(true)]
class WidgetProviderFactory : IClassFactory
where T : IWidgetProvider, new()
{
public int CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject)
{
ppvObject = IntPtr.Zero;

if (pUnkOuter != IntPtr.Zero)
{
Marshal.ThrowExceptionForHR(CLASS_E_NOAGGREGATION);
}

if (riid == typeof(T).GUID || riid == Guid.Parse(COM.Guids.IUnknown))
{
// Create the instance of the .NET object
ppvObject = MarshalInspectable.FromManaged(new T());
}
else
{
// The object that ppvObject points to does not support the
// interface identified by riid.
Marshal.ThrowExceptionForHR(E_NOINTERFACE);
}

return 0;
}

int IClassFactory.LockServer(bool fLock)
{
return 0;
}

private const int CLASS_E_NOAGGREGATION = -2147221232;
private const int E_NOINTERFACE = -2147467262;

}
}
По этой ссылке (известные несовместимости обрезки) этот тип кода взаимодействия COM несовместим с обрезкой .NET и AOT, и альтернативным подходом является использование COM-оболочек или их генерации исходного кода: Генерация исходного кода для ComWrappers.
Подход к созданию исходного кода кажется более простым. Но разработчику .NET, который ничего не знает о COM, все равно сложно прочитать документацию и понять, как переписать код.
Спасибо всем, кто попытается решить эту проблему!< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-comwra
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»