js调用activex控件,activex控件
1.在计算机输出缩微胶片组件中调用Java脚本语言函数
//连接点方式页面爪哇岛描述语言脚本
对象类id= CLSID:b568f 111-dfe 4-4944-B67F-0728 ab 2 ab 30 f id= testCom VIEWASTEXT/object
脚本语言= JavaScript for= testCom event= staTe(s)
alert( State( s ));
返回123;
/脚本
脚本语言=JavaScript
测试通信.FireStateEvent( Hello );
/脚本
//事件属性方式页面爪哇岛描述语言脚本
功能开启状态{
alert( on状态( s ));
返回456;
}
var o=new ActiveXObject(TestATL .TestCom’);
哦。开状态=开状态;
o.FireStateEvent( Hello );
//Com组件VC7.1 ATL代码
__interface _ITestComEvents{
[id(1),helpstring(State事件)]HRESULT State([in]BSTR str);
};
_ _ event _ _ interface _ ITestComEvents;
IDispatchPtr m _ onState//事件属性
标准方法(get _ onState)(IDispatch * * pVal){
* pVal=m _ onState
返回好的
};
标准方法(put _ onState)(IDispatch * new val){
m _ onState=newVal
返回好的
};
标准方法(FireStateEvent)(BSTR海峡){
_ _提升状态(str);//激发连接点事件
变化的结果;
CComVariant avar params[1]={ str };
disp params disp params={ avar params,NULL,1,0} .
excel info
memset( excepInfo,0,sizeof excepInfo);
UINT narg err=(UINT)-1;//初始化为无效参数
if (m_onState) //激发属性事件
HRESULT hr=m_onState- Invoke(0,IID_NULL,区域设置_用户_默认,
DISPATCH_METHOD,dispParams,result,excepInfo,narg err);
返回好的
}
参见:
如何从VC网络浏览器应用程序调用脚本函数
如何在计算机输出缩微胶片对象中使用java描述语言函数对象?
在计算机输出缩微胶片组件中调用Java脚本语言函数
2.从页面爪哇岛描述语言向Com组件传递结构数组
//页面脚本
var o=new ActiveXObject(TestATL .TestCom’);
哦。开状态=开状态;
o.Put(array ,{0: 123,1: ABC });
o.Put(array ,[456, def ]);
o.Put(array ,[{姓名:汤姆,年龄:8},{姓名:杰克,年龄:10 }]);
var a=新数组(789,‘吉’);//具有"长度"属性
o.Put(array ,a);
//Com组件VC7.1 ATL代码
STDMETHODIMP CTestCom:Put(BSTR键,变量值)
{
宽字符输出[4096]=L " ";
if(0==wcsicmp(key,Larray) VT_DISPATCH==value.vt)
{
IDispatchPtr sp disp=value。pdispval
DISPID DISPID=0;
DISPPARAMS dispParams={NULL,NULL,0,0} .
变化的结果;
excel info
memset( excepInfo,0,sizeof excepInfo);
UINT narg err=(UINT)-1;//初始化为无效参数
无符号整数长度=0;//数组长度或属性个数
LPOLESTR func=L 长度
HRESULT HR=sp disp-GetIDsOfNames(GUID _ NULL,func,1,LOCALE_SYSTEM_DEFAULT,dispID);
if(S_OK==hr){ //如果有长度属性
hr=spDisp- Invoke(dispID,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYGET,dispParams,result,excepInfo,narg err);
if(S_OK==hr VT_I4==result.vt)
length=result.intVal//直接读取数组长度
}否则{
无符号int ype info=0;
HR=sp disp-GetTypeInfoCount(nTypeInfo);
ATLASSERT(1==nTypeInfo);
ITypeInfoPtr spTypeInfo
hr=spDisp- GetTypeInfo(0,0,sp类型信息);
TYPEATTR * pTypeAttr=NULL
HR=sp类型信息-GetTypeAttr(pTypeAttr);
//ATLASSERT( { c 59 c6b 12-f6c 1-11CF-8835-00 a0c 911 E8 b 2 } ==pTypeAttr-guid);//JScript:
length=pTypeAttr-cVars;//从类型信息读取数组长度
sp type info-ReleaseTypeAttr(pTypeAttr);
}
对于(无符号int I=0;我长度;我)
{
WCHAR buf[32];
_itow(i,buf,10);
函数=缓冲
HR=sp disp-GetIDsOfNames(GUID _ NULL,func,1,LOCALE_SYSTEM_DEFAULT,dispID);
hr=spDisp- Invoke(dispID,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYGET,dispParams,result,excepInfo,narg err);
如果(S_OK!=hr)
继续;
if(VT_DISPATCH==result.vt){
IDispatchPtr spItem=result。pdispval
func=L 名称
HR=spItem-GetIDsOfNames(GUID _ NULL,func,1,LOCALE_SYSTEM_DEFAULT,dispID);
hr=spItem- Invoke(dispID,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYGET,dispParams,result,excepInfo,narg err);
if(S_OK==hr VT_BSTR==result.vt)
swprintf(output wcslen(output),Lname=%s ,结果。bstr val);
func=L age
HR=spItem-GetIDsOfNames(GUID _ NULL,func,1,LOCALE_SYSTEM_DEFAULT,dispID);
hr=spItem- Invoke(dispID,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYGET,dispParams,result,excepInfo,narg err);
if(S_OK==hr VT_I4==result.vt)
swprintf(output wcslen(output),L age=%d/n ,结果。intval);
}else if(VT_BSTR==结果。VT)
swprintf(output wcslen(output),LBSTR:%s/n ,结果。bstr val);
else if(VT_I4==result.vt)
swprintf(output wcslen(output),LI4:%d/n ,result。intval);
其他
swprintf(output wcslen(output),Litem.vt=%d/n ,结果。vt);
}
}
FireStateEvent(输出);
返回好的
}
3.枚举工业管理学(工业工程)窗口的内容,并调用其中的脚本
#导入mshtml.tlb //Internet Explorer 5
#进口shdocvw.dll
SHDocVw:IShellWindowsPtr spSHWinds;
寒风创建实例(_ _ uuidof(SHDocVw:shell windows));
long nCount=spSHWinds-get count();
IDispatchPtr spDisp
for(long I=0;我不算;我)
{
_variant_t va(i,VT _ I4);
sp disp=spSHWinds-Item(va);
SHDocVw:iwebbrowser 2 ptr sp浏览器(sp disp);
if (spBrowser!=空)
{
_ bstr _ t location=sp浏览器-get location name();
if(_ bstr _ t(L test DAP ctrl )==location)//找指定工业管理学(工业工程)窗口
{
ihtmldocument 2 ptr spDoc(sp浏览器-get document());
如果(spDoc!=空)
{
_ bstr _ t exp=m _ onState
IDispatch * pdis=NULL
HR=sp doc-get _ Script(pdis);
如果(pdis){
DISPID tmpDispID=0;
LPOLESTR func=L Test//JavaScript函数名
HR=pdis-GetIDsOfNames(GUID _ NULL,func,1,LOCALE_SYSTEM_DEFAULT,tmpDispID);
if(S_OK==hr)
hr=pdis- Invoke(tmpDispID,IID_NULL,区域设置_用户_默认
DISPATCH_METHOD,dispParams,result,excepInfo,narg err);
}
}
}
}
}
参见:
如何:连接到正在运行的微软公司出品的web浏览器实例
微软倡导的微软倡导的ActiveX网络化多媒体对象技术网络化多媒体对象技术组件与Java脚本语言交互
微软倡导的微软倡导的ActiveX网络化多媒体对象技术网络化多媒体对象技术组件控制其所在的工业管理学(工业工程)窗口
4.在副主席中执行脚本
#导入msscript。ocx//msscript。定制控件
使用命名空间MSScriptControl
IScriptControlPtr pScriptControl(_ _ uuidof(脚本控制));
LPSAFEARRAY psa
SAFEARRAYBOUND rgs bound[]={ 1,0 };//1个元素,从0开始
int I;
psa=SafeArrayCreate(VT_VARIANT,1,rgs bound);
如果(!psa)
{
返回内存不足
}
变体五味[1];
for(I=0;我我)
{
variant init(v flavors[I]);
v _ VT(vFlavors[I])=VT _ BSTR;
}
v _ BSTR(vFlavors[0])=SysAllocString(bstr);
long lZero=0;
hr=SafeArrayPutElement(psa,lZero,vFlavors[0]);
for(I=0;我我)
{
SysFreeString(vFlavors[i]).bstr val);
}
pScriptControl-Language= JScript ;
pScriptControl-allow ui=TRUE;
_ bstr _ t exp=L 1 2 3
_ variant _ t outpar=pScriptControl-Eval(exp);
//_ variant _ t outpar=pScriptControl-execute语句(exp);
//_ variant _ t outpar=pScriptControl-Run( mystring函数,PSA);
_ bstr _ t bstr return=(_ bstr _ t)outpar;
char * pResult=(char *)bstr return;
安全销毁(PSA);
参见:
如何在C中调用微软脚本控件的运行()方法
来自程序员网站抑素样免疫反应博客