Хотелось бы узнать как правильно реализовывать работу с 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;
};
Правильно ли удалось мне перенести интерфейс? И как лучше это делать?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне необходима помощь в создании проектаСам проект я делаю на C# и у меня появилась проблема
Иногда требуется отображать в textBlock картинку, сpng всё отлично, а тут попалось
Всем привет, нормального ответа на мой вопрос я не нашел, поэтому задаю его здесь: HTML + ajax
В документации Laravel Eloquent есть методы например Model::UpdateOrCreate(), но нету примеров, как использовать эти методы для множества строк, в stackoverflow нашел...