转载请注明文章出处与作者信息。
最近查找了很多资料来执行自定义的JS函数,例如:function TC(){var t=document.title;return t;} 。 网上搜索的资料有蛮多,但是一直没能很快的完成。花了2天时间,终于完成了。特发博记忆与分享下。
1、首先在源文件里 加入导入库和空间声明:
#import "C:\\windows\\system32\\msscript.ocx"
using namespace MSScriptControl;
2、在程序启动时 初始化COM组件,退出时 释放COM组件:
//初始化COM组件
CoInitialize(NULL);
释放COM
CoUninitialize();
3、主要的实现代码。
HRESULT hr;
IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
LPSAFEARRAY psa;
SAFEARRAYBOUND rgsabound[] = { 1, 0 }; // 1 elements, 0-based
int i;
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
if (!psa)
{
return ;
}
VARIANT vFlavors[1];
for (i = 0; i < 1; i++)
{
VariantInit(&vFlavors[i]);
V_VT(&vFlavors[i]) = VT_BSTR;
}
V_BSTR(&vFlavors[0]) = SysAllocString(L"TC_P");
long lZero = 0;
hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
for(i=0;i<1;i++)
{
SysFreeString(vFlavors[i].bstrVal);
}
pScriptControl->Language = "JScript";
pScriptControl->AllowUI = TRUE;
_bstr_t exp = L"function TC(){var t=document.title;return t;}";
pScriptControl->AddCode(exp);
IHTMLDocument2 *objDocument1=NULL;
IHTMLWindow2* pIHTMLWindow1 = NULL;
objDocument1=(IHTMLDocument2 *)pBrowser.get_Document();
if(objDocument1)
{
objDocument1->get_parentWindow(&pIHTMLWindow1);
pScriptControl->AddObject("window", pIHTMLWindow1, VARIANT_TRUE); //这几句代码很重要,没有的话,执行会报错。
}
_variant_t outpar = pScriptControl->Run("TC", &psa); //outpar是js函数执行后的返回值
// DWORD err = ::GetLastError();
_bstr_t bstrReturn = (_bstr_t)outpar.bstrVal;
char *pResult = (char *)bstrReturn;
SafeArrayDestroy(psa);
return ;
上面代码是综合了网上很多盆友的思路和代码编写而成。感谢互联网与大鸟们的分享精神!
![](https://i-blog.csdnimg.cn/blog_migrate/f8bfbb94f6b883f1977f73b05737fc38.gif)