Представление IUnknown в управляемом C++

Я создаю Wrapper на C++/CLI для статической библиотеки C, которая будет использоваться в приложении .NET через C#.

У меня есть такая функция в C

long    My_COM_Interface(   PVOID hDevice,IUnknown **pUnknown);

Как объявить IUnknown ** в C++/CLI

в качестве первого аргумента я использую IntPtr, но не могу найти замену для IUknown.

У меня есть GUID другого типа данных COM в другой функции, это тоже проблема для меня.

Пожалуйста, помогите мне найти замену для типа данных IUnknown и GUID.


person Chris_vr    schedule 24.10.2011    source источник


Ответы (3)


замены нет.

C++/CLI прекрасно понимает собственные типы. Включите правильные заголовочные файлы, и вы сможете использовать IUnknown* как всегда.

person Ben Voigt    schedule 24.10.2011
comment
На самом деле, вы не должны, по крайней мере, не использовать публичные методы. Если вы это сделаете, вам придется использовать указатели на любую другую сборку .net, которая использует вашу библиотеку, что не идеально. - person yms; 12.12.2013
comment
@yms: класс C++/CLI должен полностью обертывать нативный объект, чтобы другие сборки, использующие вашу библиотеку, даже не знали, что существует IUnknown*, неважно, что с этим нужно справиться. - person Ben Voigt; 12.12.2013
comment
Но вопрос заключался в том, как объявить метод, который использует IUnknown, поэтому ответ не может состоять в том, чтобы просто использовать IUnknown... - person yms; 12.12.2013
comment
@yms: Но это связано с потреблением кода C, а не с созданием управляемого интерфейса для использования другим кодом .NET. - person Ben Voigt; 12.12.2013
comment
@yms: Вы когда-нибудь создавали такую ​​оболочку? У меня было, много раз. Внутри реализации вы используете все обычные собственные типы указателей. Открытый интерфейс оболочки, который используют потребители .NET, — это ref class типы, определенные в C++/CLI. Потребитель не видит собственные указатели, а только набор управляемых методов (доступные варианты поведения, которые внутренне используют указатели и вызовы собственных библиотек, API-интерфейсы Win32 и т. д.). - person Ben Voigt; 12.12.2013
comment
Да, я построил такие обертки, иначе я бы с вами это не обсуждал. Я хотел сказать, что из описания вопроса неясно, пытался ли ОП использовать IUnknown* внутри или в объявлении метода, который он намеревался использовать из .Net, и ваш ответ также не делает различий. - person yms; 12.12.2013
comment
@yms: Из вопроса видно, что IUnknown** появляется на стороне статической библиотеки C оболочки. - person Ben Voigt; 12.12.2013
comment
@yms: В частности, я думаю, что ваш второй комментарий был о том, как объявить метод неправильным. Вопрос ничего не говорит об объявлении метода. Он спросил, как объявить переменную в контексте того, как вызвать существующую функцию с таким параметром. - person Ben Voigt; 12.12.2013

Я бы сослался на API, например.

 public static IntPtr GetIUnknownForObject(Object o);

Этот API можно просто использовать из C++/CLR и предлагает вам использовать IntPtr^

person sehe    schedule 24.10.2011

попробуйте использовать такой параметр, как;

ref object pUnknown

и использовать его как

MyObject o = pUnknown as MyObject
person Emir Akaydın    schedule 24.10.2011
comment
для void * вы должны использовать ref IntPtr в С# - person Emir Akaydın; 24.10.2011
comment
@EmirAkaydın, но вопрос о C++/CLI, а не о C#. - person svick; 25.10.2011