Как получить указатель на интерфейс? - PullRequest
4 голосов
/ 23 февраля 2011

Я пытаюсь выполнить эту функцию:

public static int QueryInterface(
    IntPtr pUnk,
    ref Guid iid,
    out IntPtr ppv
)

, где

pUnk
Type: System.IntPtr
The interface to be queried.

По сути, Marshal.QueryInterface запрашивает указатель на указанный интерфейс из COM-объекта. Существует ряд интерфейсов, которые я хотел бы запросить (все из IPersist), так как мне получить указатель на эти интерфейсы?

Примечание: IPersistStorage является одним из них.

edit (это работает):

// Use the CLSID to instantiate the COM object using interop.
Type type = Type.GetTypeFromCLSID(myGuid);
Object comObj = Activator.CreateInstance(type);

// Return a pointer to the objects IUnknown interface.
IntPtr pIUnk = Marshal.GetIUnknownForObject(comObj);
IntPtr pInterface;
Int32 result = Marshal.QueryInterface(pIUnk, ref myGuid, out pInterface);

1 Ответ

4 голосов
/ 23 февраля 2011

Прочитайте последнюю строку раздела замечаний на странице Marshal.QueryInterface().

Метод QueryInterface предоставляет метод IUnknown :: QueryInterface дляCOM-объект, который пытается получить определенный указатель на интерфейс.[...] Чтобы получить значение IntPtr , представляющее указатель интерфейса IUnknown , вы можете вызвать Marshal.GetComInterfaceForObject , Marshal.GetIUnknownForObject или Marshal.GetIDispatchForObject .

Я полагаю, вы ищете метод Marshal.GetComInterfaceForObject().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...