关于js调用ocx返回BSTR的内存泄露问题

关于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,

 

Bbs9

 

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和标志号去

Bbs7 版主

Blank Blank Blank

用法完全正确,可以查看js是否有办法释放之类的,若无,自己写一个函数,js调用他来释放

0 2014-02-20 09:35:53

只看TA 引用 举报 #4    得分 0

ocx中的参数类型是BSTR *的,JS中可以接收吗目前我希望的功能是ocx给页面数据传送中文的字符串,然后显示。 (1)把参数写成了BSTR *的类型,JS中接收的时候一直报参数类型不匹配,请问各种大神,JS中应该用什么样的类型接收呢? (2)ocx

Bbs5

引用 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不会进行释放,导致内存泄露。各位老大有没有相应的解决方案

Bbs1

引用 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请问是哪里的问题?​​​​​​​

archiefei_teng

Bbs1

引用 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会不会自动释放呢?

Bbs6

这个你弄错了。
JavaScript约定了使用BSTR进行传递,那么JavaScript作为调用者会自动SysFreeString,这是符合COM互操作规范的,所以你的担心是多余的。微软不会犯你想的这种低级错误。
虽然这个BSTR会释放,但如果在JavaScript里使用了全局变量接收了数据,还是会占着空间(虽然这个不叫内存泄露)。解决方法有两个:一是在函数里使用var方式定义局部变量,这个出作用域后会自动释放。二是数据用完后吧那个变量赋空字符串。

3 2014-05-19 16:48:19

只看TA 引用 举报 #9    得分 0

BSTR导致内存泄露问题在开发中对经常会由于粗心或遗漏而导致的BSTR内存泄露问题,特意研究并进行了整理,内部有教详细的说明,希望对大家能有所帮助。(注:涉及公司版权问题,仅供参考、谢谢)

 

HaoYuan

Bbs2

楼主的问题解决了吗?
我也遇到内存泄露的问题了,不知道是不是activeX中用了BSTR的缘故

0 2014-08-26 20:21:22

Bbs5

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

Bbs7

使用[out]方式声明接口参数,它的资源是由客户端自动释放,你不用管

0 2014-08-27 08:40:38

只看TA 引用 举报 #12    得分 0

JS调用OCX,一步步教你JS调用OCX,一步步教你,包括传参版和无参版,和所需要注意的问题,再学不会我也没办法了,一起文件都是原创,禁止乱传

Bbs7

而且一般com接口方法返回HRESULT 而非bstr,js调用方要达到 var a= comobj.somefun() 形式还要
用 [out,retval]方式声明接口参数,且这个参数要求在最后一个

 

原文地址:https://bbs.csdn.net/topics/390712111

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值