关于js调用ocx返回BSTR的内存泄露问题
各位大侠,现在有个问题不知道怎么解决
JS脚本调用OCX的方法,获取一张图片的数据
现在的设计是返回字符串
由于OCX返回字符串只能返回BSTR,但是这就有一个问题,这个BSTR的内存JS无法释放,就会引起内存泄露
目前的写法是
CString tmp;
return tmp.AllocSysString();
因为图片较大,如果内存泄露的话就会比较严重,大家看看有什么好办法没有
增加一个函数给JS调用,函数内部SysFreeString释放
VS2005 ocx返回BSTR方法问题VC6.0中返回BSTR方法采用的方法是: BSTR CXXCtrl::status() { CString strResult; // TODO: Add your dispatch handler
这种写法就是对的,应该看JS那边的用法。
0 2014-02-19 22:19:26
只看TA 引用 举报 #2 得分 0
ocx控件中的函数,如何输出BSTR *str参数的值用MFC写了个简单的ocx控件,一个函数int2string(int aaa, BSTR* str),函数实现如下: char *pChar = (char*)str; itoa(aaa,pChar,
BSTR都必须使用SysFreeString释放,否则肯定内存泄漏,BSTR是一个非常特殊的数据形式,它是一个内存指针,但又不是指向内存块的首字节
0 2014-02-20 09:23:29
只看TA 引用 举报 #3 得分 0
js调用OCX,怎么输出BSTR的数据。。。如题。。 所给文档的方法 LONG INF_Ip2216_GetCamInfo(LONG lCamID, LONG lFlag, BSTR pbstrCamInfo); 通过一个lCamID和标志号去
版主
用法完全正确,可以查看js是否有办法释放之类的,若无,自己写一个函数,js调用他来释放
0 2014-02-20 09:35:53
只看TA 引用 举报 #4 得分 0
ocx中的参数类型是BSTR *的,JS中可以接收吗目前我希望的功能是ocx给页面数据传送中文的字符串,然后显示。 (1)把参数写成了BSTR *的类型,JS中接收的时候一直报参数类型不匹配,请问各种大神,JS中应该用什么样的类型接收呢? (2)ocx
引用 4 楼 xuddk727 的回复:
用法完全正确,可以查看js是否有办法释放之类的,若无,自己写一个函数,js调用他来释放
方法1. 你开一个固定的区域,多次循环利用,最后ocx释放的时候回收,但是别用static成员,否则不支持多实例ocx.
方法2. java(JS)开一个内存区域,你填进数据就行了,当然,最好java也是一次开,否则图片显示刷新过快,GC也来不及回收,还是会耗尽内存。
0 2014-02-20 10:02:17
只看TA 引用 举报 #5 得分 0
引用 1 楼 oyljerry 的回复:
增加一个函数给JS调用,函数内部SysFreeString释放
目前是这样
fun 1 ()
{
return bstr;
//这里无法释放
}
fun 2 ()
{
bstr.SysFreeString();
//失败,崩溃,我通过地址查看,头4个byte数据被改变,赋值成原数据,依然无法free
}
1 2014-03-03 15:37:15
只看TA 引用 举报 #6 得分 0
js调用com接口返回BSTR出现内存泄露最近在做JS调用C++接口,发现在如果返回字符串BSTR给js,会出现内存泄露问题。因为返回的BSTR如果不使用SysAllocString,在函数返回后会自动释放内存,导致js调用其返回值时出现错误。如果使用SysAllocString申请内存,返回后js不会进行释放,导致内存泄露。各位老大有没有相应的解决方案
引用 2 楼 akirya 的回复:
这种写法就是对的,应该看JS那边的用法。
但是JS这边只能声明var类型,无法进行内存操作和管理
0 2014-03-03 15:37:46
只看TA 引用 举报 #7 得分 0
关于JS调用OCX的问题rndocument.getElementById('Video1').Play();rnVideo1为OCX的ID,在网页里没问是,但在VS2008里调试时,就报JAVASCRIPT错误,对象不支持此方法rnrnrn请问是哪里的问题?
引用 3 楼 worldy 的回复:
BSTR都必须使用SysFreeString释放,否则肯定内存泄漏,BSTR是一个非常特殊的数据形式,它是一个内存指针,但又不是指向内存块的首字节
嗯,确实是这样,但如何释放bstr 数据占用的那块内存呢,因为是作为返回值,JS也无法使用出参来获取数据
0 2014-03-03 15:39:30
只看TA 引用 举报 #8 得分 0
BSTR 和VARIANT 内存泄露问题前情提要:最近调用com接口,用了很多的BSTR和VARIANT(因为com接口参数需要),后来发现内存泄露有点严重rn怀疑是调用了这个两个类型的原因rn1、BSTR a;rn 调用微软的com接口,传入参数a得到了值,之后,是否需要自己释放a呢,如果释放,用SysFreeString?rn 可是我没调用SysAllocString?,rnrn2、VARIANT b;rn 如果我不调用VariantClear(&b);出了作用域后,b会不会自动释放呢?
这个你弄错了。
JavaScript约定了使用BSTR进行传递,那么JavaScript作为调用者会自动SysFreeString,这是符合COM互操作规范的,所以你的担心是多余的。微软不会犯你想的这种低级错误。
虽然这个BSTR会释放,但如果在JavaScript里使用了全局变量接收了数据,还是会占着空间(虽然这个不叫内存泄露)。解决方法有两个:一是在函数里使用var方式定义局部变量,这个出作用域后会自动释放。二是数据用完后吧那个变量赋空字符串。
3 2014-05-19 16:48:19
只看TA 引用 举报 #9 得分 0
BSTR导致内存泄露问题在开发中对经常会由于粗心或遗漏而导致的BSTR内存泄露问题,特意研究并进行了整理,内部有教详细的说明,希望对大家能有所帮助。(注:涉及公司版权问题,仅供参考、谢谢)
楼主的问题解决了吗?
我也遇到内存泄露的问题了,不知道是不是activeX中用了BSTR的缘故
0 2014-08-26 20:21:22
CString::AllocSysString();肯定是要释放的,你可以使用固定缓冲区啊,循环使用,ocx退出的时候一次释放
0 2014-08-26 22:33:57
只看TA 引用 举报 #11 得分 0
BSTR用法详解BSTR详解 BSTR 详解一 - BSTR 简介和内部结构 1 Why need BSTR COM 是一种跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 · C++ 字符串是以 0 结束的 ASCII 或 Unicode 字符数组 · Vi
使用[out]方式声明接口参数,它的资源是由客户端自动释放,你不用管
0 2014-08-27 08:40:38
只看TA 引用 举报 #12 得分 0
JS调用OCX,一步步教你JS调用OCX,一步步教你,包括传参版和无参版,和所需要注意的问题,再学不会我也没办法了,一起文件都是原创,禁止乱传
而且一般com接口方法返回HRESULT 而非bstr,js调用方要达到 var a= comobj.somefun() 形式还要
用 [out,retval]方式声明接口参数,且这个参数要求在最后一个
原文地址:https://bbs.csdn.net/topics/390712111