怎樣在IE10中調用js的腳本

在IE10中調用js的腳本,首先想到IE10中active控件。說做SSLVPN客戶端的真苦逼,不斷對付windows的升級,ie的升級,殺軟的阻撓。
最近發現win8下sslvpn客戶端可以安裝,不能使用。調試了一下,發現js根本沒有調用。
經過和vip菜鳥的討論,他也沒發現代碼問題,但是建議根據返回值看看是否調用成功。
pScript->Invoke返回值0X80020003,無效的調用。
仔細看了一下
hr = pScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
得到的dispid是-1,hr的值是0X80020006 (DISP_E_UNKNOWNNAME)未知名稱。
感到奇怪的是,這段代碼在以前的IE版本中運行很正常。
看了一下csdn,建議使用
LPOLESTR pwFunName = L"m_strTest"; // 準備取得 Add 函數的序號 DispID
DISPID dispID; // 取得的序號,準備保存到這裏
hr = pDispatch->lpVtbl->GetIDsOfNames( // 根據函數名,取得序號的裝修報價函數…
真是胡扯。
看了一下msdn,瞭解到
While IDispatch->GetIDsOfNames() fails to get a Dispatch ID of the variable in IE9, it turns out that using the result from get_Script() as IDispatchEx instead of IDispatch and calling:
這就很簡單了,
CComPtr<IDispatchEx> pDispEx;
hr = pDisp->QueryInterface(IID_IDispatchEx, (void**)&pDispEx);
得到IDispatchEx指針,
HRESULT hr = pDispEx->GetDispID( CComBSTR( name ), fdexNameImplicit, &id );
代替

HRESULT hr = pDisp->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &id )
然後使用IDispatchEx::InvokeEx ,他的參數傳遞和invoke 有很大區別。
基本就是這個樣子
IDispatch *disp = pszBufData->pdispVal;
if (pszBufData->vt & VT_BYREF)
    disp = *(pszBufData->ppdispVal);

// Get IDispatchEx on input IDispatch
CComQIPtr<IDispatchEx> pdispexArray(disp);
if ( ! pdispexArray )
    return E_NOINTERFACE;

// Get array length DISPID
DISPID dispidLength;
CComBSTR bstrLength(L"length");
HRESULT hr = pdispexArray->GetDispID(bstrLength, fdexNameCaseSensitive, &dispidLength);
if (FAILED(hr))
    return false;

 // Get length value using InvokeEx()
CComVariant varLength;
DISPPARAMS dispParamsNoArgs = {0};
hr = pdispexArray->InvokeEx(dispidLength, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParamsNoArgs, &varLength,
    NULL, NULL);
if (FAILED(hr))
    return hr;

ATLASSERT(varLength.vt == VT_I4);
const int count = varLength.intVal;

BYTE * pData = new BYTE[count];

// For each element in source array:
for (int i = 0; i < count; i++)
{
    CString strIndex;
    strIndex.Format(L"%d", i);

    // Convert to BSTR, as GetDispID() wants BSTR's
    CComBSTR bstrIndex(strIndex);
    DISPID dispidIndex;
    hr = pdispexArray->GetDispID(bstrIndex, fdexNameCaseSensitive, &dispidIndex);
    if (FAILED(hr))
        break;

    // Get array item value using InvokeEx()
    CComVariant varItem;
    hr = pdispexArray->InvokeEx(dispidIndex, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParamsNoArgs, &varItem,
        NULL, NULL);
    if (FAILED(hr))
        break;

    ATLASSERT(varItem.vt == VT_I4);

    pData[i] = varItem.intVal;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章