请问javascript与COM组件(ATL)互传参数的规范? 高分相送 ! 200 分 ! 没有什么规范。脚本执行器会帮助转换。转换不了就抛出异常(VBScript就经常见。。)。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没什么规范,尽量用字符串就是了,数组就用xml组织吧 比如用javascipt向ATL组件传一个字符串数组, JS中怎么声明,调用? ATL中如何声明接口,使用参数 ? 谢谢答复。 首先Javascript Engine(假设Engien是用C++编写)解释语句如 comObject.doAdd( "1", 2 );Javascript Engine读取到的参数是LPTSTR类型。然后会把参数转换成VARIANT类型然后把这些参数做成一个参数数组(VARIANT类型数组)然后再调用这个Com对象的invoke函数一个Com组件聪明的知道他自己的每一个引出函数有几个参数,每个参数是什么类型(类型信息定义在IDL文件中,直接编译进DLL或EXE中),所以它能成功的将参数转换成整数然后调doAdd函数。 如果JS传给组件字符串或字符串数组, 组件接口函数 应该分别以哪种声明方式来接受 ? flyycyu(fly):能讲讲用字符串传递数组吗?最好有个 简单的例子。为什么不能直接传数组 ? 在javascript中声明变量声明var a = "1";var b = 2;comObject.doAdd( "1", 2 );COM接口定义和普通的COM编程一样[ object, uuid(7213F5FD-7637-4295-8274-C118D797D58F), dual, nonextensible, helpstring("YourCom Interface"), pointer_default(unique)]interface YourCom : IDispatch{ [id(1), helpstring("method doAdd")] HRESULT doAdd(LONG a, LONG b);}; 巴迪,很感谢你的回复,不过传整型浮点型我都搞定了。 我现在想知道的是怎么传字符串和字符串数组 如果组件以VARIANT接受的话,该怎么去处理,是转换成 BSTR 还是 LPCTSTR ? 谢谢答复, 我急着要散分了 :) 如果传递的参数是数组的话收到的参数应该是 IDispatch*(我猜)JavaScript中的数组本身大概是一个Com对象。var a = new Array;a[0] = "1";a[1] = 2;comObject.doSomething( a ); 是吗 ? 我觉得组件应该以 VARIANT 来接受这个数组。 至于数组传过来之后怎么还原为数组我就不知道了。 COM中的函数:STDMETHODIMP CfControl::vm(VARIANT array, LONG size){ // TODO: 在此添加实现代码 USES_CONVERSION; std::ostringstream buf; OLECHAR * name= L"toString"; DISPID disp; array.pdispVal->GetIDsOfNames(IID_NULL,&name,1,GetUserDefaultLCID(),&disp); DISPPARAMS dispp={0,0,NULL,NULL}; VARIANT r; array.pdispVal->Invoke(disp,IID_NULL,GetUserDefaultLCID(),DISPATCH_METHOD,&dispp,&r,NULL,NULL); buf<<OLE2T(r.puiVal); MessageBox(buf.str().c_str()); buf.clear(); return S_OK;}调用脚本: var s=[]; s[0]="abc"; s[1]="123451"; s[2]="xyu"; fControl.vm(s,s.length); 我认为在com中接收的参数全用BSTR就行了,传递字符串数组用xml数据流;如:动态数组<Root> <Array id='1' value='dfsdf'/> <Array id='2' value='asdf'/> ...</Root>甚至是多维数组:<Root> <Array id='1' value='dfsdf'> <A2 id='' value=''/> ... </Array> <Array id='2' value='asdf'> <A2 id='' value=''/> .... </Array> ...</Root> xml结构这么安排会更好些动态数组:<Root> <Array value='dfsdf'/> <Array value='asdf'/> ...</Root>多维数组:<Root> <Array value='dfsdf' value2='' value3='' .../> <Array value='asdf' value2='' value3='' .../> ...</Root>这个数据流作为字符串发到com上,com在内部用dom解析就好了 极具挑战性的JACASCRIPT功能,大伙帮帮忙 为什么我的Firebug不报错呢,还是Firefox不报错? jquery高手进 编码问题,请高手指点 如何用延时调用类中的方法? EXT 中width我设置的值没有用,这是怎么回事呢? csdn 的论坛回复编辑器,是哪里来的? 如何用jquery获取这个里的html div元素 关于DOCUMENT对象的使用? 请问ASP中JAVAscript的变量传递 大家好:在javascript中怎么定义公共变量等 数据库数据给数组赋值的问题,急!
比如用javascipt向ATL组件传一个字符串数组,
JS中怎么声明,调用? ATL中如何声明接口,使用参数 ? 谢谢答复。
如 comObject.doAdd( "1", 2 );
Javascript Engine读取到的参数是LPTSTR类型。
然后会把参数转换成VARIANT类型
然后把这些参数做成一个参数数组(VARIANT类型数组)
然后再调用这个Com对象的invoke函数一个Com组件聪明的知道他自己的每一个引出函数有几个参数,每个参数是什么类型(类型信息定义在IDL文件中,直接编译进DLL或EXE中),所以它能成功的将参数转换成整数然后调doAdd函数。
如果JS传给组件字符串或字符串数组, 组件接口函数 应该分别以哪种声明方式来接受 ? flyycyu(fly):能讲讲用字符串传递数组吗?最好有个 简单的例子。为什么不能直接传数组 ?
var a = "1";
var b = 2;
comObject.doAdd( "1", 2 );
COM接口定义和普通的COM编程一样
[
object,
uuid(7213F5FD-7637-4295-8274-C118D797D58F),
dual,
nonextensible,
helpstring("YourCom Interface"),
pointer_default(unique)
]
interface YourCom : IDispatch{
[id(1), helpstring("method doAdd")] HRESULT doAdd(LONG a, LONG b);
};
巴迪,很感谢你的回复,不过传整型浮点型我都搞定了。 我现在想知道的是怎么传字符串和字符串数组 如果组件以VARIANT接受的话,该怎么去处理,是转换成 BSTR 还是 LPCTSTR ? 谢谢答复, 我急着要散分了 :)
收到的参数应该是 IDispatch*(我猜)JavaScript中的数组本身大概是一个Com对象。var a = new Array;
a[0] = "1";
a[1] = 2;
comObject.doSomething( a );
是吗 ? 我觉得组件应该以 VARIANT 来接受这个数组。 至于数组传过来之后怎么还原为数组我就不知道了。
STDMETHODIMP CfControl::vm(VARIANT array, LONG size)
{
// TODO: 在此添加实现代码
USES_CONVERSION; std::ostringstream buf; OLECHAR * name= L"toString";
DISPID disp;
array.pdispVal->GetIDsOfNames(IID_NULL,&name,1,GetUserDefaultLCID(),&disp); DISPPARAMS dispp={0,0,NULL,NULL}; VARIANT r;
array.pdispVal->Invoke(disp,IID_NULL,GetUserDefaultLCID(),DISPATCH_METHOD,&dispp,&r,NULL,NULL); buf<<OLE2T(r.puiVal);
MessageBox(buf.str().c_str());
buf.clear();
return S_OK;
}调用脚本:
var s=[];
s[0]="abc";
s[1]="123451";
s[2]="xyu";
fControl.vm(s,s.length);
如:动态数组
<Root>
<Array id='1' value='dfsdf'/>
<Array id='2' value='asdf'/>
...
</Root>
甚至是多维数组:
<Root>
<Array id='1' value='dfsdf'>
<A2 id='' value=''/>
...
</Array>
<Array id='2' value='asdf'>
<A2 id='' value=''/>
....
</Array>
...
</Root>
动态数组:
<Root>
<Array value='dfsdf'/>
<Array value='asdf'/>
...
</Root>
多维数组:
<Root>
<Array value='dfsdf' value2='' value3='' .../>
<Array value='asdf' value2='' value3='' .../>
...
</Root>
这个数据流作为字符串发到com上,com在内部用dom解析就好了