0

このコードを使用して、C++ の IWebBrowser2 Web ブラウザーでイベントをシンクしています。

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 を呼び出すと、次のエラーが発生します。

*webhost.exe の 0x7c812afb で未処理の例外: Microsoft C++ 例外: メモリ位置 0x0012ed50 で _com_error。

DocumentComplete の行にコメントを付けると、エラーは表示されません。また、try..catch ブロックは例外をキャッチしません。

私がやろうとしているのは、 Variant * url を使用して std::string と比較することです。

これどうやってするの?

4

3 に答える 3

0

戻り値 ([out] パラメーター) をイベント パラメーターの 1 つとして使用しています。これにより、VARIANT に BSTR が含まれていないため、bstr_t が com_error 例外をスローします。

正しい DocumentComplete 署名については、 MSDN のドキュメントを参照してください。

イベント パラメータは、pVarResult ではなくpDispParams から取得できます。名前付き引数で呼び出されないと仮定すると (そして、このイベントは呼び出されるべきではありません)、URL は pDispParams->rgvarg[0] で、ウィンドウ/フレームは pDispParams->rgvarg[1] で利用できます。idl で宣言されているパラメーターは、rgvarg 配列では逆の順序になっています。

可能であれば、 IDispatch を自分で実装する代わりに、ATL のIDispEventSimpleImplを使用して C++ で COM イベント インターフェイスを実装することをお勧めします。

于 2010-10-05T02:08:30.680 に答える
0

http://msdn.microsoft.com/en-us/library/9k3ebasf(v=VS.100).aspx
コンストラクターは 、_bstr_tVARIANT へのポインターではなく、VARIANT の参照のみを受け取ります。

于 2010-10-05T01:01:10.523 に答える
0

YeenFei は答えの半分を与えました。残りの半分は、bstr を取得した後、ANSI 文字列ではなく Unicode 文字列を指すようになることです。ANSI 文字列を取得する場合は、ポインターを変換するのではなく、文字列を Unicode から ANSI に変換する必要があります。

于 2010-10-05T01:03:19.007 に答える