ActiveX与JS交互
来源:互联网 发布:mysql修改字段唯一性 编辑:程序博客网 时间:2024/06/05 12:05
001
1.在COM组件中调用JavaScript函数
002
// 连接点方式页面javascript脚本
003
<object classid=
"CLSID:B568F111-DFE4-4944-B67F-0728AB2AB30F"
id=
"testCom"
VIEWASTEXT></object>
004
<script language=
"JavaScript"
for
=
"testCom"
event=
"staTe(s)"
>
005
alert(
"State("
+ s +
")"
);
006
return
123;
007
</script>
008
<script language=
"JavaScript"
>
009
testCom.FireStateEvent(
"Hello"
);
010
</script>
011
012
// 事件属性方式页面javascript脚本
013
function onState(s){
014
alert(
"onState("
+ s +
")"
);
015
return
456;
016
}
017
var o =
new
ActiveXObject(
"TestATL.TestCom"
);
018
o.onstaTe=onState;
019
o.FireStateEvent(
"Hello"
);
020
021
// Com组件VC7.1 ATL代码
022
__interface _ITestComEvents{
023
[id(1), helpstring(
"State事件"
)]
HRESULT
State([in] BSTR str);
024
};
025
__event __interface _ITestComEvents;
026
IDispatchPtr m_onState;
// 事件属性
027
STDMETHOD(get_onState)(IDispatch** pVal) {
028
*pVal = m_onState;
029
return
S_OK;
030
};
031
STDMETHOD(put_onState)(IDispatch* newVal) {
032
m_onState = newVal;
033
return
S_OK;
034
};
035
STDMETHOD(FireStateEvent)(BSTR str) {
036
__raise State(str);
// 激发连接点事件
037
CComVariant result;
038
CComVariant avarParams[1] = {str};
039
DISPPARAMS dispParams = {avarParams, NULL, 1, 0};
040
EXCEPINFO excepInfo;
041
memset
(&excepInfo, 0,
sizeof
excepInfo);
042
UINT
nArgErr = (
UINT
)-1;
// initialize to invalid arg
043
if
(m_onState)
// 激发属性事件
044
HRESULT
hr = m_onState->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT,
045
DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
046
return
S_OK;
047
}
048
参见:
049
How To Call a Script Function from a VC WebBrowser Application
050
如何在COM object中使用 Javascript function object?
051
在COM组件中调用JavaScript函数
052
053
2.从页面javascript向Com组件传递结构数组
054
// 页面脚本
055
var o =
new
ActiveXObject(
"TestATL.TestCom"
);
056
o.onstaTe=onState;
057
o.Put(
"array"
, {0: 123, 1:
"abc"
});
058
o.Put(
"array"
, [456,
"def"
]);
059
o.Put(
"array"
, [{name:
"tom"
, age: 8}, {name:
"jack"
, age: 10}]);
060
var a =
new
Array(789,
"ghi"
);
// has "length" property
061
o.Put(
"array"
, a);
062
063
// Com组件VC7.1 ATL代码
064
STDMETHODIMP CTestCom::Put(BSTR key, VARIANT value)
065
{
066
WCHAR
output[4096] = L
""
;
067
if
(0 == wcsicmp(key, L
"array"
) && VT_DISPATCH == value.vt)
068
{
069
IDispatchPtr spDisp = value.pdispVal;
070
DISPID dispID = 0;
071
DISPPARAMS dispParams = {NULL, NULL, 0, 0};
072
CComVariant result;
073
EXCEPINFO excepInfo;
074
memset
(&excepInfo, 0,
sizeof
excepInfo);
075
UINT
nArgErr = (
UINT
)-1;
// initialize to invalid arg
076
unsigned
int
length = 0;
// 数组长度 或 属性 个数
077
078
LPOLESTR func = L
"length"
;
079
HRESULT
hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
080
if
(S_OK == hr){
// 如果有"length"属性
081
hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
082
if
(S_OK == hr && VT_I4 == result.vt)
083
length = result.intVal;
// 直接读取数组长度
084
}
else
{
085
unsigned
int
nTypeInfo = 0;
086
hr = spDisp->GetTypeInfoCount(&nTypeInfo);
087
ATLASSERT(1 == nTypeInfo);
088
ITypeInfoPtr spTypeInfo;
089
hr = spDisp->GetTypeInfo(0, 0, &spTypeInfo);
090
TYPEATTR *pTypeAttr = NULL;
091
hr = spTypeInfo->GetTypeAttr(&pTypeAttr);
092
//ATLASSERT("{C59C6B12-F6C1-11CF-8835-00A0C911E8B2}" == pTypeAttr->guid); // JScript:
093
length = pTypeAttr->cVars;
// 从类型信息读取数组长度
094
spTypeInfo->ReleaseTypeAttr(pTypeAttr);
095
}
096
for
(unsigned
int
i=0; i<length; i++)
097
{
098
WCHAR
buf[32];
099
_itow(i, buf, 10);
100
func = buf;
101
hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
102
hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
103
if
(S_OK != hr)
104
continue
;
105
if
(VT_DISPATCH == result.vt){
106
IDispatchPtr spItem = result.pdispVal;
107
func = L
"name"
;
108
hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
109
hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
110
if
(S_OK == hr && VT_BSTR == result.vt)
111
swprintf(output + wcslen(output), L
"name=%s"
, result.bstrVal);
112
func = L
"age"
;
113
hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
114
hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
115
if
(S_OK == hr && VT_I4 == result.vt)
116
swprintf(output + wcslen(output), L
" age=%d/n"
, result.intVal);
117
}
else
if
(VT_BSTR == result.vt)
118
swprintf(output + wcslen(output), L
"BSTR:%s/n"
, result.bstrVal);
119
else
if
(VT_I4 == result.vt)
120
swprintf(output + wcslen(output), L
"I4:%d/n"
, result.intVal);
121
else
122
swprintf(output + wcslen(output), L
"item.vt=%d/n"
, result.vt);
123
}
124
}
125
FireStateEvent(output);
126
return
S_OK;
127
}
128
129
3.枚举IE窗口的内容,并调用其中的脚本
130
#import <mshtml.tlb> // Internet Explorer 5
131
#import <shdocvw.dll>
132
SHDocVw::IShellWindowsPtr spSHWinds;
133
spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
134
long
nCount = spSHWinds->GetCount();
135
IDispatchPtr spDisp;
136
for
(
long
i = 0; i < nCount; i++)
137
{
138
_variant_t va(i, VT_I4);
139
spDisp = spSHWinds->Item(va);
140
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
141
if
(spBrowser != NULL)
142
{
143
_bstr_t location = spBrowser->GetLocationName();
144
if
(_bstr_t(L
"Test DapCtrl"
) == location)
// 找指定IE窗口
145
{
146
IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
147
if
(spDoc != NULL)
148
{
149
_bstr_t
exp
= m_onState;
150
IDispatch *pdis = NULL;
151
hr = spDoc->get_Script(&pdis);
152
if
(pdis){
153
DISPID tmpDispID = 0;
154
LPOLESTR func = L
"Test"
;
// javascript 函数名
155
hr = pdis->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &tmpDispID);
156
if
(S_OK == hr)
157
hr = pdis->Invoke(tmpDispID, IID_NULL, LOCALE_USER_DEFAULT,
158
DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
159
}
160
}
161
}
162
}
163
}
164
参见:
165
HOWTO: Connect to a Running Instance of Internet Explorer
166
ActiveX组件与JavaScript交互
167
ActiveX组件控制其所在的IE窗口
168
169
4.在VC中执行脚本
170
#import <msscript.ocx> // msscript.ocx
171
using
namespace
MSScriptControl;
172
IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
173
LPSAFEARRAY psa;
174
SAFEARRAYBOUND rgsabound[] = { 1, 0 };
// 1 elements, 0-based
175
int
i;
176
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
177
if
(!psa)
178
{
179
return
E_OUTOFMEMORY;
180
}
181
VARIANT vFlavors[1];
182
for
(i = 0; i < 1; i++)
183
{
184
VariantInit(&vFlavors[i]);
185
V_VT(&vFlavors[i]) = VT_BSTR;
186
}
187
V_BSTR(&vFlavors[0]) = SysAllocString(bstr);
188
long
lZero = 0;
189
hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
190
for
(i=0;i<1;i++)
191
{
192
SysFreeString(vFlavors[i].bstrVal);
193
}
194
pScriptControl->Language =
"JScript"
;
195
pScriptControl->AllowUI = TRUE;
196
_bstr_t
exp
= L
"1+2+3"
;
197
_variant_t outpar = pScriptControl->Eval(
exp
);
198
//_variant_t outpar = pScriptControl->ExecuteStatement(exp);
199
//_variant_t outpar = pScriptControl->Run("MyStringFunction", &psa);
200
_bstr_t bstrReturn = (_bstr_t)outpar;
201
char
*pResult = (
char
*)bstrReturn;
202
SafeArrayDestroy(psa);
203
参见:
204
How To Call Run() Method of the Microsoft Script Control in C++
http://www.cnblogs.com/zdxster/archive/2011/01/27/1945879.html
- ActiveX与JS交互
- ActiveX与JS交互
- ActiveX与JS交互
- VB ActiveX与JS交互
- activex与前台JS交互
- activex与前台JS交互
- ActiveX控件与JS页面函数交互
- C# ActiveX 与JS 交互,只介绍JS调用ActiveX的情况
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- flex与activeX的交互
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- ActiveX组件与JavaScript交互
- ZeroMQ多线程使用规则
- Oracle数据库维护常用SQL语句集合
- Integration Tomcat into Apache Httpd
- C#程序重新启动自己
- 惜缘惜福
- ActiveX与JS交互
- 如何实现int、char*、float、与CString之间的转换
- linux clock_gettime函数详解
- Java ThreadLocal - How to use and code sample
- SSE
- Configure SVN,SCP in Ant
- VMware安装RedHat Linux 9.0上网详细设置
- Android之Tab分页标签的实现方法一-----TabActivity和TabHost的结合(一)
- 修改.h文件引起的编译问题