Вариант * к строке выдает неизвестное исключение - PullRequest
0 голосов
/ 05 октября 2010

Я использую этот код для приема событий в веб-браузере IWebBrowser2 на c ++:

STDMETHODIMP AdviseSink::Invoke(DISPID dispIdMember,
                                    REFIID riid,
                                    LCID lcid,
                                    WORD wFlags,
                                    DISPPARAMS* pDispParams,
                                    VARIANT* pVarResult,
                                    EXCEPINFO* pExcepInfo,
                                    UINT* puArgErr)
{

    if (!pDispParams)
        return DISP_E_PARAMNOTOPTIONAL;

    switch (dispIdMember)
    {
        case DISPID_DOCUMENTCOMPLETE:
        {
            DocumentComplete(pVarResult);
            return S_OK;
        }

        case DISPID_NAVIGATECOMPLETE2:
            return S_OK;

        default:
            return DISP_E_MEMBERNOTFOUND;
    }

    return S_OK;
}


void DocumentComplete(VARIANT *url)
{
    std::string strValue = (char*)_bstr_t(url);
}

При вызове (void) DocumentComplete я получаю эту ошибку:

* Необработанное исключение в 0x7c812afb в webhost.exe: Microsoft C ++ исключение: _com_error в ячейке памяти 0x0012ed50. *

Если прокомментировать строку в DocumentComplete, она не показывает никаких ошибок. Также блоки try..catch не ловят исключение.

То, что я пытаюсь сделать, это использовать Variant * url, чтобы сравнить его с std :: string.

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 05 октября 2010

YeenFei дал половину ответа.Другая половина состоит в том, что после того, как вы получите ваш bstr, он будет указывать на строку Unicode, а не на строку ANSI.Если вы хотите получить строку ANSI, вы должны сделать это путем преобразования строки из Unicode в ANSI, а не путем преобразования указателя.

0 голосов
/ 05 октября 2010

Вы используете возвращаемое значение (параметр [out]) в качестве одного из параметров события.Это заставит bstr_t выдать исключение com_error, поскольку VARIANT не содержит BSTR.

См. Документацию MSDN для правильной подписи DocumentComplete.

Параметры событиядоступны из pDispParams , а не pVarResult.Предполагая, что он не вызывается с именованными аргументами (и это событие не должно быть), URL будет доступен по адресу pDispParams-> rgvarg [0], а окно / фрейм - по адресу pDispParams-> rgvarg [1].Параметры находятся в обратном порядке в массиве rgvarg, как они объявлены в idl.

Если вы можете, я рекомендую вместо этого использовать IDispEventSimpleImpl ATL для реализации интерфейсов событий COM в C ++ вместовнедряем IDispatch самостоятельно.

0 голосов
/ 05 октября 2010

http://msdn.microsoft.com/en-us/library/9k3ebasf(v=VS.100).aspx
Конструктор _bstr_t принимает только ссылку на VARIANT вместо указателя на него.

...