如何从ActiveX控件向JavaScript传递数组
2006-04-28 23:16
465 查看
从ActiveX控件向JavaScript传递数组似乎不是一件容易的事,因为JavaScript好像不能接受从ActiveX控件传来的引用参数,所以实际上我并没有找到直接传递的方案(如果有朋友找到了,欢迎留言),而是绕了个弯,将数组格式化成字符串传了出去。看到这里,可能很多朋友已经完全明白我的做法了。对于不太熟悉COM编程的朋友,可以看看下面的具体步骤:
(1)为ActiveX控件增加传递数组的接口函数(方法),该函数的返回参数为[out, retval] BSTR* fvector。因为BSTR和JavaScript中的字符串都是Unicode编码的,所以可以无需转换直接传递。
(2)函数实现示例
#include <stdio.h>
//将数组格式化为空格相隔的字符串
STDMETHODIMP CMyClass::CalFeatureVector(BSTR *fvector)
{
double dFv[50];
int dim = 50;
//allocate a buffer large enough to hold the string converted from the array
wchar_t vecbuf[1000];
wcscpy(vecbuf, L"");
wchar_t numbuf[20];
for(int i=0; i<dim-1; i++) //concat the double number with a blank
{
swprintf(numbuf, L"%.8f ", dFv[i]); //见注释1
wcscat(vecbuf, numbuf);
}
swprintf(numbuf, L"%.8f", dFv[dim-1]); //the last one doesn't need to append a blank
wcscat(vecbuf, numbuf);
*fvector = SysAllocString(vecbuf); //return the string of the vector //见注释2
return S_OK;
}
注释:
1.需引入头文件<stdio.h>,若出现链接错误,则可在VC6.0的工程设置中选择C/C++选项,将预处理程序定义
中的_MIN_CRT去掉。该宏的作用是最小化引入CRT库,减小控件大小,但会使有些C库函数用不了。
2.COM中分配字符串的常用方法是SysAllocString,勿使用fvector = new wchar_t[1000],这样最多只能申请
长度为490的字符串,超过490就会出错。另外虽然没有用SysFreeString释放字符串,但经测试上百万次用上述
方式将ActiveX控件中的字符串传递给JavaScript,并没有发现内存增加,估计是JavaScript中的内存管理机制
对字符串进行了自动回收。
(1)为ActiveX控件增加传递数组的接口函数(方法),该函数的返回参数为[out, retval] BSTR* fvector。因为BSTR和JavaScript中的字符串都是Unicode编码的,所以可以无需转换直接传递。
(2)函数实现示例
#include <stdio.h>
//将数组格式化为空格相隔的字符串
STDMETHODIMP CMyClass::CalFeatureVector(BSTR *fvector)
{
double dFv[50];
int dim = 50;
//allocate a buffer large enough to hold the string converted from the array
wchar_t vecbuf[1000];
wcscpy(vecbuf, L"");
wchar_t numbuf[20];
for(int i=0; i<dim-1; i++) //concat the double number with a blank
{
swprintf(numbuf, L"%.8f ", dFv[i]); //见注释1
wcscat(vecbuf, numbuf);
}
swprintf(numbuf, L"%.8f", dFv[dim-1]); //the last one doesn't need to append a blank
wcscat(vecbuf, numbuf);
*fvector = SysAllocString(vecbuf); //return the string of the vector //见注释2
return S_OK;
}
注释:
1.需引入头文件<stdio.h>,若出现链接错误,则可在VC6.0的工程设置中选择C/C++选项,将预处理程序定义
中的_MIN_CRT去掉。该宏的作用是最小化引入CRT库,减小控件大小,但会使有些C库函数用不了。
2.COM中分配字符串的常用方法是SysAllocString,勿使用fvector = new wchar_t[1000],这样最多只能申请
长度为490的字符串,超过490就会出错。另外虽然没有用SysFreeString释放字符串,但经测试上百万次用上述
方式将ActiveX控件中的字符串传递给JavaScript,并没有发现内存增加,估计是JavaScript中的内存管理机制
对字符串进行了自动回收。
相关文章推荐
- [javascript] javascript 如何在 ajax 直接传递数组
- Delphi写的ActiveX控件如何返回数组到Vbscript/javascript
- 如何将服务器端计算出的数组传递到客户端的JavaScript?
- 如何将php数组或者对象传递给javascript
- [javascript] javascript 如何在 ajax 直接传递数组
- 如何将php数组或者对象传递给javascript
- 如何将php数组或者对象传递给javascript
- JavaScript使用数组拼接字符串性能如何?
- 二维数组名如何作为参数传递
- 关于vbscript 与 javascript如何传递变量(包括服务器端与客户端)
- COM/DCOM中如何传递数组
- 如何给JavaScript外部文件传递参数
- (转)如何在JavaScript与ActiveX之间传递数据2
- 如何在linux Shell脚本里面把一个数组传递到awk内部进行处理
- java中如何在ajax发送参数的时候,参数以数组的方式传递到后数组台
- 在C++中如何将ActiveX控件所使用的BSTR数据转换成CHAR字符数组?
- 如何将多维数组作为参数传递给函数?(以二维数组为例)
- C语言中如何将数组作为函数参数传递
- 如何如何让你的程序运行的更快 (2)--- JavaScript中的数组之字符串下标的运用
- [javascript]如何检测数组?