`
daoger
  • 浏览: 525139 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

求助:ocx控件中的variant类型如何用js赋值

阅读更多
从昨天开始搞一个画图的ocx控件,在网页中调用它,通过javascript给它赋值;调用一个控件中一个画图方法AddNewStream()的时候,怎么试都说是有 “类型不匹配”的错误;控件是用C++写的,

这是方法:

void AddNewStream(short stream_seqid, short stream_showflag, unsigned long stream_color, LPCTSTR stream_name, LPCTSTR stream_unit, double stream_scale, LPCTSTR stream_remark, short m_nPenStyle, short m_nPenWidth, short m_nNumValidDataRT, VARIANT * m_dValueRT)
	{
		static BYTE parms[] = VTS_I2 VTS_I2 VTS_UI4 VTS_BSTR VTS_BSTR VTS_R8 VTS_BSTR VTS_I2 VTS_I2 VTS_I2 VTS_PVARIANT ;
		InvokeHelper(0x3, DISPATCH_METHOD, VT_EMPTY, NULL, parms, stream_seqid, stream_showflag, stream_color, stream_name, stream_unit, stream_scale, stream_remark, m_nPenStyle, m_nPenWidth, m_nNumValidDataRT, m_dValueRT);
	}



这是人家给的一个调用AddNewStream方法的例子:

static int bbb=0;
	bbb++;

	VARIANT var;
	VariantInit(&var);
	SAFEARRAYBOUND rgsabound[2];
	


	m_vvvv.ClearAllStream();


	m_vvvv.SetHorizontalTimeUnit(5,"秒");  //设置横坐标单位及其描述,0显示到年、1显示到月、依次类推

	m_vvvv.SetHorizontalX2Time(1);			//是否将横坐标转换成时间:1代表转换、0代表不转换

	m_vvvv.Set_ChartType(0);//显示棒图或曲线图:1代表曲线图;0代表棒图

		int nLength = 10;

		rgsabound[0].lLbound=0;
		rgsabound[1].lLbound=0;
		rgsabound[0].cElements=nLength;
		rgsabound[1].cElements=2;
		var.vt=VT_R8|VT_ARRAY;
		var.parray=SafeArrayCreate(VT_R8,2,rgsabound);


		
		long   index[2];   
		double   data;   


		index[0]=0;
		index[1]=0;
		data=132.184906;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=0;
		index[1]=1;
		data=12*60*60+10;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);


		index[0]=1;
		index[1]=0;
		data=132.337234;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=1;
		index[1]=1;
		data=12*60*60+30;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);


		index[0]=2;
		index[1]=0;
		data=132.003876;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=2;
		index[1]=1;
		data=12*60*60+40;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);


		index[0]=3;
		index[1]=0;
		data=132.221054;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=3;
		index[1]=1;
		data=14*60*60+10;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);


		index[0]=4;
		index[1]=0;
		data=132.383438;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=4;
		index[1]=1;
		data=14*60*60+30;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);

		index[0]=5;
		index[1]=0;
		data=131.439148;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=5;
		index[1]=1;
		data=15*60*60+20;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);

		index[0]=6;
		index[1]=0;
		data=131.950562;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=6;
		index[1]=1;
		data=15*60*60+30;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);

		index[0]=7;
		index[1]=0;
		data=132.065659;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=7;
		index[1]=1;
		data=15*60*60+50;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);


		index[0]=8;
		index[1]=0;
		data=132.047348;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=8;
		index[1]=1;
		data=17*60*60+20;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);


		index[0]=9;
		index[1]=0;
		data=132.123352;  //实际值
		SafeArrayPutElement(var.parray,   index,   &data);
		index[0]=9;
		index[1]=1;
		data=18*60*60+30;						//时间
		SafeArrayPutElement(var.parray,   index,   &data);

	



	m_vvvv.AddNewStream(bbb,true,RGB(100+bbb*20,200-bbb*30,30*bbb*50),"GaoXingAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXX","GaoXing",bbb,"GaoXing",1,1,10,&var);	//添加曲线数据	
		::SafeArrayDestroyData(var.parray);
		::VariantClear(&var);


[b]我自己不懂C++,我现在遇到的问题是该方法的最后一个参数是VARIANT类型的,我怎么用javascript给这个ocx控件中的该方法赋值?[/b]

请各位不吝赐教!
分享到:
评论
8 楼 jack 2007-05-24  
多半是要改的,给不同的脚本调用,这样写太过随意了点
7 楼 daoger 2007-05-24  
哦!谢谢各位了,我在搞搞看看,是在不行就得更换ocx控件中的参数类型了!
6 楼 qiezi 2007-05-24  
看看这篇有没有帮助:
http://www.5inet.net/HomePage/FrontPage/069941.html

按这篇的说法你应该是没办法成功调用了,除非它的接口更改,或者是你包装一层接口。
5 楼 jack 2007-05-24  
variant类型虽然号称支持随意类型,但是真正支持的种类依然是有限制的。如果实在不行,就转换成可以支持的类型去操作。

如果是二维数组,可以考虑当作一维数组来传递,或者干脆用一维数组来构建二维数组。
4 楼 daoger 2007-05-24  
jack 写道
js里面调用variant类型,没有试过,不过在其他的script语言中遇到过类似的问题。记得当初的用法是 明确 “调用类型”,比如你是传入是int,那么调用的时候做一次类型转换,或者指定类型 ,用这样的方式来传值
i=0;
funcall((int)i);




jack 大哥,能说得清除一点吗?
用其他脚本语言怎么操作啊?象vbscript。我需要的是一个二维数组类型的参数!
3 楼 daoger 2007-05-24  
抛出异常的爱 写道
引用
Delphi 2.0引进了一个功能强大的数据类型,称为变体类型( Va r i a n t ),主要是为了支持O L E自动化
操作。实际上, D e l p h i的Va r i a n t封装了O L E使用的Va r i a n t,但D e l p h i的Va r i a n t在D e l p h i程序的其他领域
也很有用。正如不久就要学到的, Object Pascal是唯一能在运行期间和编译期间识别Variant 的语言。
Delphi 3引进了一个新的被称为O l e Variant 类型,它跟Va r i a n t基本一致,但是它只能表达与OLE 自
动化操作相兼容的数据类型。本节介绍Va r i a n t ,然后介绍O l e Va r i a n t,并对两者进行比较。
1. Va r i a n t能动态改变类型
有时候变量的类型在编译期间是不确定的,而Va r i a n t能够在运行期间动态地改变类型,这就是引
入Variant 类型目的。例如,下面的代码在编译期间和运行期间都是正确的:
v a r
V: Va r i a n t ;
b e g i n
V:='Delphi is Great!'; //Variant 此时是一个字符串
V: = 1 ; / / Variant 此时是一个整数
V: = 1 2 3 . 3 4 ; / / Variant 此时是一个浮点数
V: = Tr u e ; / / Variant 此时是一个布尔值
V:=CreateOleObject('word.Basic'); //Va r i a n t此时是一个OLE 对象
e n d ;

Va r i a n t能支持所有简单的数据类型,例如整型、浮点型、字符串、布尔型、日期和时间、货币以
及O L E自动化对象等。注意Va r i a n t不能表达Object Pascal对象。Va r i a n t可以表达不均匀的数组(数组的
长度是可变的,它的数据元素能表达前面介绍过的任何一种类型,也可包括另一个Va r i a n t数组)。


MS:传个数组就可以吧。。。JS不都是数组么?


数组我试过了,参数要求的是二维数组,我传递的也是二维数组,象这样:

var a = new Array(new Number(132.184906),new Number(132.337234),new Number(132.003876),new Number(132.221054),new Number(132.383438),new Number(131.439148),new Number(131.950562),new Number(132.065659),new Number(132.047348),new Number(132.123352));
				var b = new Array(12*60*60+10,12*60*60+30,12*60*60+40,12*60*60+10,12*60*60+30,12*60*60+20,12*60*60+30,12*60*60+50,12*60*60+20,12*60*60+30);
				var point = new Array(new Array(),new Array());
				
				for(var i = 0;i<10;i++)
				{
					point[0][i] = a[i];
					point[1][i] = b[i];
				}

我传递的是point,可是不行!
2 楼 jack 2007-05-24  
js里面调用variant类型,没有试过,不过在其他的script语言中遇到过类似的问题。记得当初的用法是 明确 “调用类型”,比如你是传入是int,那么调用的时候做一次类型转换,或者指定类型 ,用这样的方式来传值
i=0;
funcall((int)i);


1 楼 抛出异常的爱 2007-05-24  
引用
Delphi 2.0引进了一个功能强大的数据类型,称为变体类型( Va r i a n t ),主要是为了支持O L E自动化
操作。实际上, D e l p h i的Va r i a n t封装了O L E使用的Va r i a n t,但D e l p h i的Va r i a n t在D e l p h i程序的其他领域
也很有用。正如不久就要学到的, Object Pascal是唯一能在运行期间和编译期间识别Variant 的语言。
Delphi 3引进了一个新的被称为O l e Variant 类型,它跟Va r i a n t基本一致,但是它只能表达与OLE 自
动化操作相兼容的数据类型。本节介绍Va r i a n t ,然后介绍O l e Va r i a n t,并对两者进行比较。
1. Va r i a n t能动态改变类型
有时候变量的类型在编译期间是不确定的,而Va r i a n t能够在运行期间动态地改变类型,这就是引
入Variant 类型目的。例如,下面的代码在编译期间和运行期间都是正确的:
v a r
V: Va r i a n t ;
b e g i n
V:='Delphi is Great!'; //Variant 此时是一个字符串
V: = 1 ; / / Variant 此时是一个整数
V: = 1 2 3 . 3 4 ; / / Variant 此时是一个浮点数
V: = Tr u e ; / / Variant 此时是一个布尔值
V:=CreateOleObject('word.Basic'); //Va r i a n t此时是一个OLE 对象
e n d ;

Va r i a n t能支持所有简单的数据类型,例如整型、浮点型、字符串、布尔型、日期和时间、货币以
及O L E自动化对象等。注意Va r i a n t不能表达Object Pascal对象。Va r i a n t可以表达不均匀的数组(数组的
长度是可变的,它的数据元素能表达前面介绍过的任何一种类型,也可包括另一个Va r i a n t数组)。


MS:传个数组就可以吧。。。JS不都是数组么?

相关推荐

    WebAccess实战应用二 :OCX 控件在WebAccess 中的应用.rar

    WebAccess实战应用二 :OCX 控件在WebAccess 中的应用rar,WebAccess实战应用二 :OCX 控件在WebAccess 中的应用

    SignTool:ocx控件打包成cab

    SignTool:ocx控件打包成cab,省去安装空间的步骤

    海康威视摄像头OCX控件

    海康威视摄像头OCX控件,可以显示摄像头图像、抓取图像、保存图像等,在C#、VB、组态王中都可以使用。 带:OCX控件接口说明(V2.3).doc

    HTML调用OCX控件

    项目代码,主要描述两个问题:1、OCX控件在html中的声明格式2、OCX接口的调用方法(注:在网页测试时还需要先将OCX控件注册,本人之前上传过OCX控件注册反注册的工具)

    海康内部ocx视频控件,海康官方ocx控件下载,C,C++

    组态王程式内添加海康监控视频必须的控件:海康内部ocx视频控件

    大华摄像头OCX控件及使用例子.rar

    大华摄像头OCX控件使用例子 。这种方式目前只有IE浏览器支持。注意控件相关的OCX和dll要注册成功,网页才能使用。

    海康摄像机ActiveX控件(ocx控件)

    海康视屏ocx控件,最新版本,可通过web访问,也可能过集成到软件中使用

    使用C++制作ocx控件

    在vs2010下使用C++开发并使用ocx控件教程,同时说明JavaScript调用ocx控件方法

    8个用于FTP操作的OCX控件合集

    自己收集的FTP OCX控件合集,包含一个OCX函数查看器-可看OCX中的所有函数及所需参数,方便您使用: 6B605F6A CIFTP.OCX BE91B3F6 cscxftp.ocx FACF1D34 CSFTP32.OCX E22A7F7A EZFTP.OCX 5BF2AE1E FTP.ocx DDBC...

    51个VB6 OCX控件 打包

    51个VB6 OCX控件 打包 控件列表: AniGIFV6.ocx asAssistantPopup.ocx asBubbleForm.ocx asctrls.ocx chklsb26.ocx ComboBox.ocx COMCT232.OCX comctl32.ocx COMDLG32.OCX CurtButton.ocx daxctle.ocx DBGRID32.OCX ...

    Qt/C++中使用OCX控件的调用方法及事件处理代码实例

    Qt/C++中使用OCX控件的调用方法及事件处理 代码实例简单的调用了OCX提供的函数,和OCX事件处理(采用了信号与槽的方式),调用qt的方法获取列出所有ocx控件的所有信号、函数、属性等。 谢谢大家的分享和分数,我很...

    chrome 调用ocx控件

    chrome调用ocx控件, 安装此插件可以调用身份证阅读器

    神器ocx控件方法查看器.

    ocx控件方法查看器,可以查看封装好的ocx控件里的方法。不可以查看dll、exe等其他文件,亲测对ocx控件可以有效查看其方法。

    海康威视组态王OCX控件

    支持最新的海康录像机,登录,退出,播放,停止播放,抓BMP图片和存储路径设置。...可以作为组态王的OCX控件。 在注册OCX时,请确保动态库都齐全,可以用附件内的常用运行库。记得打上VS2010的运行库。

    海康威视OCX控件,支持Wincc平台下在ActiveX中添加该控件。

    海康威视OCX控件,首先在Windows系统中用Regsvr32命令注册该控件,然后可以在Wincc平台下,在ActiveX中添加该控件即可使用.

    海康OCX控件.zip

    海康威视的OCX控件,通过控件可以实现视频预览、抓拍、录像、云台控制、对讲、声音控制、亮度等设置。有详细的注册图解,也有WINCC集成视频的实例,内含VBS脚本文件,可以作为参考使用。

    久其表格OCX控件(报表)

    久其表格OCX控件是北京久其软件股份有限公司开发的一套专用于报表开发的表格控件,通过表格OCX控件可实现多种复杂报表的设计,可以对报表进行展示、录入、打印、导出等多种操作。久其表格控件操作简单,结构清晰,...

    GifPlayer.ocx,vb播放动画的ocx控件

    GifPlayer.ocx,vb播放动画的ocx控件

    解决ocx控件在ie中加载不上的问题

    html版 需要用户用ie打开,然后允许activeX的运行就行了,这里面会吧“OCX控件强行注册+可信任站点添加+可信任站点ActiveX安全设置启用+收藏夹”全都做了,收藏夹有提示是否进行收藏 bat+reg版 考虑到用户电脑使用...

    海康视频OCX控件 Acvtive

    海康威视的OCX控件,通过控件可以实现视频预览、抓拍、录像、云台控制、对讲、声音控制、亮度等设置。

Global site tag (gtag.js) - Google Analytics