Как COM выбирает, как упорядочить интерфейс?

Существуют DNRtv с на PowerShell и PowerGUI. Существуют также Скалы.NET! эпизоды об этих инструментах.

6
задан sharptooth 12 November 2009 в 13:21
поделиться

2 ответа

Я немного устарел, но есть ли в вашем проекте функция с именем blindquery? (обычно это объявляется мастером, если вы создали проект C ++ ATL). Точка останова внутри функции. Функция, сгенерированная мастером, часто имеет проблемы с запросом, возвращающим E_NOINTERFACE из-за ошибочного кода.

редактировать (найден пример кода) из моего старого проекта _ слепой запрос

class ATL_NO_VTABLE CChildEvents :
    public CComObjectRootEx <CComSingleThreadModel>,
    public CComCoClass<CChildEvents, &CLSID_ChildEvents>,
    public IDispatchImpl<IChildEvents, &IID_IChildEvents, &LIBID_XXX>
{
public:
    CChildEvents(void) :
    m_pItfMgr(0)
    {
    }

    /* called from internalQI to tear off a new blind interface */
    static HRESULT WINAPI   _BlindQuery(void *pvThis, REFIID riid, void **ppv, DWORD dw);

    DECLARE_REGISTRY_RESOURCEID(IDR_CHILDEVENTS)
    DECLARE_PROTECT_FINAL_CONSTRUCT()

    BEGIN_COM_MAP(CChildEvents)
        COM_INTERFACE_ENTRY(IChildEvents)
        COM_INTERFACE_ENTRY(IDispatch)
        COM_INTERFACE_ENTRY_FUNC_BLIND(0, _BlindQuery)
    END_COM_MAP()
};


HRESULT WINAPI CChildEvents::_BlindQuery(void *pvThis, REFIID riid, void **ppv, DWORD /* dw */ )
{
    HRESULT hr = E_NOINTERFACE;
    USES_CONVERSION;

    try
    {
        if(pvThis == NULL)
        {
            ATLASSERT(FALSE);
        }
        else
        {
            /*
            * cast the pvThis pointer to the actual class £
            * so we can use it here £
            * reinterpret_cast should be safe since we're calling ourself
            */
            CChildEvents    *pThis = reinterpret_cast < CChildEvents * > (pvThis);
            if(pThis == NULL)
            {
                ATLASSERT(FALSE);
            }
            else
            {

                    /* check to see if it matches on of our children's DIID */
                                    if(memcmp(&riid,&l_someotherguid,sizeof(GUID)) == 0) {

                        /* if so cast to a IDispatch -- the standard for event interfaces */
                        *ppv = reinterpret_cast < IDispatch * > (pvThis);

                        /* addref */
                        pThis->AddRef();

                        /* reply */
                        hr = S_OK;

                }
            }
        }
    }
    catch(...)
    {
        ATLASSERT(FALSE);
    }

    /* must not be in our map - tell them to GO FISH */
    return(hr);
}
0
ответ дан 17 December 2019 в 04:48
поделиться

COM среда выполнения будет использовать маршалинг typelib (oleautomation), если вы отметите свой интерфейс как использующий стандартный маршалер, добавив его CLSID {00020424-0000-0000-C000-000000000046} в HKCR \ Interfaces \ {iid} \ ProxyStubClsid (где {iid} - это GUID вашего интерфейса). Вам также потребуется зарегистрировать библиотеку типов, чтобы среда выполнения могла извлекать информацию о параметрах, и вы можете использовать только определенное подмножество типов. Там' s еще (старая) информация здесь и здесь .

Если вы хотите использовать собственный прокси / заглушку, сгенерированную компилятором MIDL из вашего IDL, тогда вы Вместо этого мне нужно будет изменить запись реестра интерфейса на CLSID этого прокси-объекта. Это позволяет вам использовать более широкий диапазон типов, например, «сырые» массивы.

Если вы поддерживаете IMarshal , то это то, что будет использоваться вместо любого из этих механизмов. Это означает, что вы можете изменить свой объект, чтобы агрегировать беспоточный маршалер (используя его реализацию IMarshal ), не изменяя ничего в реестре. Это позволит избежать создания прокси.

Надеюсь, это поможет.

как сгенерировано компилятором MIDL из вашего IDL, тогда вам нужно будет вместо этого изменить запись реестра интерфейса, чтобы она была CLSID этого прокси-объекта. Это позволяет вам использовать более широкий диапазон типов, например, «сырые» массивы.

Если вы поддерживаете IMarshal , то это то, что будет использоваться вместо любого из этих механизмов. Это означает, что вы можете изменить свой объект, чтобы агрегировать беспоточный маршалер (используя его реализацию IMarshal ), не внося никаких изменений в реестр. Это позволит избежать создания прокси.

Надеюсь, это поможет.

как сгенерировано компилятором MIDL из вашего IDL, тогда вам нужно будет вместо этого изменить запись реестра интерфейса, чтобы она была CLSID этого прокси-объекта. Это позволяет вам использовать более широкий диапазон типов, например, "сырые" массивы.

Если вы поддерживаете IMarshal , то это то, что будет использоваться вместо любого из этих механизмов. Это означает, что вы можете изменить свой объект, чтобы агрегировать беспоточный маршалер (используя его реализацию IMarshal ), не внося никаких изменений в реестр. Это позволит избежать создания прокси.

Надеюсь, это поможет.

Если вы поддерживаете IMarshal , то это то, что будет использоваться вместо любого из этих механизмов. Это означает, что вы можете изменить свой объект, чтобы агрегировать беспоточный маршалер (используя его реализацию IMarshal ), не изменяя ничего в реестре. Это позволит избежать создания прокси.

Надеюсь, это поможет.

Если вы поддерживаете IMarshal , то он будет использоваться вместо любого из этих механизмов. Это означает, что вы можете изменить свой объект, чтобы агрегировать беспоточный маршалер (используя его реализацию IMarshal ), не изменяя ничего в реестре. Это позволит избежать создания прокси.

Надеюсь, это поможет.

5
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: