BOOL __fastcall ExeScript(TWebBrowser * Web, String jsName, TStringList *args, CComVariant *pVarResult) { IHTMLDocument2 *spDoc = (IHTMLDocument2 *)(void *)Web->Document; if(spDoc == NULL) return false; CComPtr<IDispatch> spScript; HRESULT hr = spDoc->get_Script(&spScript); ATLASSERT(SUCCEEDED(hr)); if(!SUCCEEDED(hr)) { return false; } BSTR bstrMember = WideString(jsName).c_bstr(); DISPID dispid = NULL; hr = spScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if(!SUCCEEDED(hr)) { ShowMessage(IntToHex((int)hr, 2)); spDoc->Release(); return false; } const int arraySize = args->Count; DISPPARAMS dispparams; memset(&dispparams, 0, sizeof dispparams); dispparams.cArgs = arraySize; dispparams.rgvarg = new VARIANT[dispparams.cArgs]; for(int i = 0; i < arraySize; i++) { CComBSTR bstr = WideString(args->Strings[arraySize - 1 - i]).Copy(); // back reading bstr.CopyTo(&dispparams.rgvarg->bstrVal); dispparams.rgvarg->vt = VT_BSTR; } dispparams.cNamedArgs = 0; EXCEPINFO excepInfo; memset(&excepInfo, 0, sizeof excepInfo); CComVariant vaResult; UINT nArgErr = (UINT) - 1; // initialize to invalid arg hr = spScript->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr); spDoc->Release(); delete[] dispparams.rgvarg; if(FAILED(hr)) { return false; } if(pVarResult) { *pVarResult = vaResult; } return true; }