Хотелось бы узнать как правильно реализовывать работу с 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;
};
Правильно ли удалось мне перенести интерфейс? И как лучше это делать?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей