webBrowser调用外部js文件和js函数

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sdywcd/article/details/83612032

webbrowser加载外部html文件和外部js文件,代码示例:

webBrowser1.Navigate(@"c:\test.htm");

 

外部html文件代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    
<head>
        
<title></title>
        
<script type="text/javascript" src="JScript1.js"></script>
    
</head>
    
<body onload="addHello()">
    
    
</body>
</html>

 

外部js文件代码:

function addHello(){
    
var bgObj=document.createElement("div");
    bgObj.setAttribute(
'id','bgDiv');
    bgObj.style.border
="1px solid #333";
    bgObj.innerHTML
="this is text from js file!";
    document.body.appendChild(bgObj);
}

 


展开阅读全文

WebBrowser调用js函数导致内存泄漏

12-07

在MFC程序中,显示地图并标注多个设备的实时位置等信息。目前功能都能正常实现,就是程序运行一段时间过后占用的内存明显增加。rn 大概的操作流程是:rn 1.对话框上添加Microsoft web Browser控件,定义一个control类型的变量m_explorerMap。rn 2.初始化m_explorerMap,并调用Navigate()显示地图。rn 3.使用网上下载的CWebPage类对象来调用JavaScript函数对地图操作 rnrn 由于地图显示需要经常调用js函数代码,最开始怀疑是js代码泄漏的内存。但把js代码里面所有函数的函数体内代码都注释了,即CallJScript函数调用的js函数都是空函数,泄漏内存的速度是一样的。排除了js泄漏内存的可能。rn 再把CallJScript函数体内的代码全都注释,只留return true;后,就不泄漏内存了。rn 最终把范围确定到CWebPage类中的CallJScript()函数。rn rn CallJScript()函数实现如下rn[code=c]bool CWebPage::CallJScript(const CString strFunc, const CStringArray& paramArray,CComVariant* pVarResult)rnrn CComPtr spScript;rn if(!GetJScript(spScript))rn rn ShowError("Cannot GetScript");rn return false;rn rn CComBSTR bstrMember(strFunc);rn DISPID dispid = NULL;rn HRESULT hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,rn LOCALE_SYSTEM_DEFAULT,&dispid);rn if(FAILED(hr))rn rn ShowError(GetSystemErrorMessage(hr));rn return false;rn rnrn const int arraySize = paramArray.GetSize();rnrn DISPPARAMS dispparams;rn memset(&dispparams, 0, sizeof dispparams);rn dispparams.cArgs = arraySize;rn dispparams.rgvarg = new VARIANT[dispparams.cArgs];rn rn for( int i = 0; i < arraySize; i++)rn rn CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // back readingrn bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);rn dispparams.rgvarg[i].vt = VT_BSTR;rn rn dispparams.cNamedArgs = 0;rnrn EXCEPINFO excepInfo;rn memset(&excepInfo, 0, sizeof excepInfo);rn CComVariant vaResult;rn UINT nArgErr = (UINT)-1; // initialize to invalid argrn rn hr = spScript->Invoke(dispid,IID_NULL,0,rn DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);rnrn delete [] dispparams.rgvarg;rn if(FAILED(hr))rn rn ShowError(GetSystemErrorMessage(hr));rn return false;rn rn rn if(pVarResult)rn rn *pVarResult = vaResult;rn rn return true;rn[/code]rn CallJScript()函数会调用GetJScript()函数。rn[code=c]bool CWebPage::GetJScript(CComPtr& spDisp)rnrn CHECK_POINTER(m_spDoc);rn HRESULT hr = m_spDoc->get_Script(&spDisp);rn ATLASSERT(SUCCEEDED(hr));rn return SUCCEEDED(hr);rn[/code]rnrn 对于COM编程,不太熟悉,大概的知识点都查了一遍,进行了一些尝试,但是还是没有解决问题,希望各位大佬指导一下是不是CallJScript导致的内存泄漏。如果是,具体位置在哪;如果不是,那可能在哪泄漏了内存rnrnrnrn 论坛

没有更多推荐了,返回首页