如何调用IDispatch接口的方法和属性

我们知道在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,NUL

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通过 pDispatch* 可以调用 COM 组件的属性方法,具体步骤如下: 1. 通过 CoCreateInstance 或 CoGetClassObject 创建 COM 对象的实例或类工厂,获取对象的 IUnknown 接口。 2. 通过 IUnknown 接口的 QueryInterface 方法获取对象的 IDispatch 接口。 3. 通过 IDispatch 接口的 GetIDsOfNames 方法获取属性方法的 DISPID。 4. 通过 IDispatch 接口的 Invoke 方法调用属性方法,将参数打包成 VARIANT 类型的数组传入。 示例代码如下: ``` // 创建 COM 对象实例 CLSID clsid; HRESULT hr = CLSIDFromProgID(L"YourProgID", &clsid); if (FAILED(hr)) { // 错误处理 } IUnknown* pUnknown; hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&pUnknown); if (FAILED(hr)) { // 错误处理 } // 获取 IDispatch 接口 IDispatch* pDispatch; hr = pUnknown->QueryInterface(IID_IDispatch, (void**)&pDispatch); if (FAILED(hr)) { // 错误处理 } // 获取属性方法的 DISPID DISPID dispid; LPOLESTR pszName = L"YourPropertyNameOrMethodName"; hr = pDispatch->GetIDsOfNames(IID_NULL, &pszName, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { // 错误处理 } // 调用属性方法 VARIANTARG* pArgs = new VARIANTARG[2]; pArgs[0].vt = VT_BSTR; pArgs[0].bstrVal = SysAllocString(L"YourFirstArgument"); pArgs[1].vt = VT_INT; pArgs[1].intVal = 123; DISPPARAMS params = { pArgs, NULL, 2, 0 }; VARIANT result; VariantInit(&result); hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &result, NULL, NULL); if (FAILED(hr)) { // 错误处理 } // 处理返回值 // 释放资源 delete[] pArgs; pDispatch->Release(); pUnknown->Release(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seasol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值