如何调用IDispatch接口的方法和属性
来源:互联网 发布:我的世界java下载 编辑:程序博客网 时间:2024/06/08 18:47
我们知道在C/C++语言中有函数,与函数对应的有函数指针。我们可以把一个函数指针传给一个过程,从而实现回调。
那么在脚本语言(如JavaScript)中,可以用"function"来定义一个函数,但与之相对应的却没有函数指针的概念。那么如何将这个函数传给某个过程,来实现回调的功能呢?事实上,在JavaScript中,常常将函数直接传递给一个组件的方法,实现回调。那么,反过来我们问一下,JavaScript将这个函数传入组件,到底是一个什么样的参数类型呢?
传入的参数类型即可以是IDispatch*,也可以是VARIANT(包装的仍是一个IDispatch*值)。这个函数,本质上是一个实现了IDispatch接口的对象,通过访问IDispatch接口的第一个方法,也就实现了对这个函数的回调调用。
下面的函数CCuteTools::AutoWrap以可变参数的形式,实现了对IDispatch接口中方法和属性的调用。
在写出源代码之前,我们先举一个调用它的例子。
CComPtr<IDispatch> pDispCallback; //需要回调的IDispatch接口
CComVariant vParam1="test"; //准备接收的参数1
CComVariant vParam2=(long)1234; //准备接收的参数2
CCuteTools::AutoWrap(DISPATCH_METHOD,NULL,pDispCallback,NULL,2,vParam2,vParam1);
//////////////////////////////////////////////////////////
//采用的是可变参数的形式
HRESULT CCuteTools::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp,
LPOLESTR ptName, int cArgs...)
{
// Begin variable-argument list...
va_list marker;
va_start(marker, cArgs);
HRESULT hr=AutoWrap(autoType,pvResult,pDisp,ptName,cArgs,marker);
// End variable-argument section...
va_end(marker);
return hr;
}
//
HRESULT CCuteTools::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp,
LPOLESTR ptName, int cArgs,va_list& marker)
{
//
if(!pDisp) {
return E_FAIL;
}
// Variables used...
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
if(ptName==NULL)
{
dispID=0;
}
else
{
// Get DISPID for name passed...
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT,
&dispID);
if(FAILED(hr)) {
return hr;
}
}
// Allocate memory for arguments...
VARIANT *pArgs = new VARIANT[cArgs+1];
// Extract arguments...
for(int i=0; i<cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call!
CComVariant vResult;
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType,
&dp, &vResult, NULL, NULL);
if(FAILED(hr)) {
delete [] pArgs;
return hr;
}
if(pvResult!=NULL)
{
vResult.Detach(pvResult);
}
delete [] pArgs;
return hr;
}
- 如何调用IDispatch接口的方法和属性
- IDispatch 接口方法的调用
- vb般的VC++开发(4)--调用IDispatch接口的属性和方法
- IDispatch 接口的 LPDispatch 属性
- IDispatch 及双接口的调用
- 关于 IDispatch 接口的 LPDispatch 属性的实现
- 关于 IDispatch 接口的 LPDispatch 属性的实现
- IDispatch接口 - 跨语言调用
- VC6的IDispatch接口
- IDispatch接口的作用
- IDispatch接口的作用
- IDispatch接口的作用
- IDispatch 接口和双接口
- COM组件 IDispatch 及双接口的调用
- 服务器端编程之如何开发IDispatch接口的实现类
- IDispatch接口 - GetIDsOfNames和Invoke
- IDispatch接口 - Dual和Custom
- IDispatch接口 - GetIDsOfNames和Invoke
- diStorm64 v1.5.14 by Arkon
- CSDN助手源码剖析(二)--URL Moniker的封装
- IDA Pro 4.9.0.863 Advanced Full with SDK
- 为何有些IStream不能得到HGlobal句柄
- http://www.experts-exchange.com/
- 如何调用IDispatch接口的方法和属性
- 数据串传送程序
- Germany Gone with honour - 德国队 带着胜利离开
- 今天是个好日子
- Jiangsheng的CSDN Digest(July 8, 2006)
- Oepfind 1.56 + src by Human
- KaKeeware Application Monitor v1.06
- javascript脚本加密&解密及HTML转JS
- Patch_PeEx.1.98.r3.rar