Реализация COM интерфейсов

185
27 декабря 2018, 18:10

Хотелось бы узнать как правильно реализовывать работу с COM объектами, реализацией интерфейсов IUnknown а так же правильно маршаллировать передаваемые аргументы в функции импорта из COM библиотек.

В данный момент меня интересует как правильно реализовать работу с библиотекой dxgi.

Я посмотрел наследования объектов, и все сходится к одному, все интерфейсы DXGI наследуются от IDXGIObject, при этом данный интерфейс наследуется от IUnknown. Казалось бы все просто, организовать интерфейс IDXGIObject от него наследовать дополнительные интерфейсы, и работать с ними. Но, в моем случае я просто не понимаю как правильно это делается, и каким образом работать с методом который принимает 2 параметра к примеру вот этот:

HRESULT CreateDXGIFactory(
  REFIID riid,
  void   **ppFactory
);

Да, REFIID это всего лишь typedef IID* REFIID, но тут снова вопрос, что такое IID и как его маршаллировать из c# в данный метод, содержащийся в библиотеке dxgi.

Все что пришло мне в голову, это примерно такая реализация, которую не проверял:

[Guid("aec22fb8-76f3-4639-9be0-28eb43a67a2e")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDXGIObject
{
    long SetPrivateData(
        [In] Guid refGuid,
        [In] uint dataSize,
        [In] IntPtr data);
    long SetPrivateDataInterface(
        [In] ref Guid name,
        [In][MarshalAs(UnmanagedType.IUnknown)] object data);
    long GetPrivateData(
        [In] Guid name, 
        [In][Out][MarshalAs(UnmanagedType.SysUInt)] ref uint outDataSize,
        [Out][MarshalAs(UnmanagedType.IUnknown)] IntPtr data);
    ...
}

В работе такой реализации я очень сомневаюсь, ведь выглядит все это дело подозрительно просто. И не уверен в правильности переноса интерфейса из dxgi.h

MIDL_INTERFACE("aec22fb8-76f3-4639-9be0-28eb43a67a2e")
IDXGIObject : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE SetPrivateData( 
        /* [annotation][in] */ 
        __in  REFGUID Name,
        /* [in] */ UINT DataSize,
        /* [annotation][in] */ 
        __in_bcount(DataSize)  const void *pData) = 0;
    virtual HRESULT STDMETHODCALLTYPE SetPrivateDataInterface( 
        /* [annotation][in] */ 
        __in  REFGUID Name,
        /* [annotation][in] */ 
        __in  const IUnknown *pUnknown) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetPrivateData( 
        /* [annotation][in] */ 
        __in  REFGUID Name,
        /* [annotation][out][in] */ 
        __inout  UINT *pDataSize,
        /* [annotation][out] */ 
        __out_bcount(*pDataSize)  void *pData) = 0;
    virtual HRESULT STDMETHODCALLTYPE GetParent( 
        /* [annotation][in] */ 
        __in  REFIID riid,
        /* [annotation][retval][out] */ 
        __out  void **ppParent) = 0;
};

Правильно ли удалось мне перенести интерфейс? И как лучше это делать?

READ ALSO
Написание текста после команды

Написание текста после команды

Мне необходима помощь в создании проектаСам проект я делаю на C# и у меня появилась проблема

183
Отобразить SVG в image

Отобразить SVG в image

Иногда требуется отображать в textBlock картинку, сpng всё отлично, а тут попалось

201
Отправка почты ajax + php

Отправка почты ajax + php

Всем привет, нормального ответа на мой вопрос я не нашел, поэтому задаю его здесь: HTML + ajax

163
Можно ли использовать Laravel Eloquent методы в цикле?

Можно ли использовать Laravel Eloquent методы в цикле?

В документации Laravel Eloquent есть методы например Model::UpdateOrCreate(), но нету примеров, как использовать эти методы для множества строк, в stackoverflow нашел...

154