C++ 使用IDispatch::Invoke为OLE交互构造参数
我在挣扎。据我所知,AutoWrap函数用于调用外部方法、获取/设置属性 让我们试着理解调用此函数的代码:C++ 使用IDispatch::Invoke为OLE交互构造参数,c++,windows,com,ole,C++,Windows,Com,Ole,我在挣扎。据我所知,AutoWrap函数用于调用外部方法、获取/设置属性 让我们试着理解调用此函数的代码: //使其可见(即app.visible=1) { //参数准备 变体x; x、 vt=vt_I4;//参数类型 x、 lVal=1;//值 自动包装( DISPATCH_PROPERTYPUT,//设置属性 NULL,//我们不需要结果 pXlApp,//指向Excel应用程序的指针 L“可见”、“可见”属性 1,//传递了1个参数 x//传递参数 ); } 我不明白的是x的结构: 什么
//使其可见(即app.visible=1)
{
//参数准备
变体x;
x、 vt=vt_I4;//参数类型
x、 lVal=1;//值
自动包装(
DISPATCH_PROPERTYPUT,//设置属性
NULL,//我们不需要结果
pXlApp,//指向Excel应用程序的指针
L“可见”、“可见”属性
1,//传递了1个参数
x//传递参数
);
}
我不明白的是x的结构:
x.vt=vt_I4
?它可能表示论点的类型。当它们将数组作为参数传递时,会写入以下内容:变异arr;
arr.vt=vt|u数组| vt|u变量;
看起来有点像面具
x.lVal=1代码>-这意味着我们将一个整数1传递给Visible函数。但是每种类型的参数都必须使用哪些属性呢?我在文章中看到了“lVal”和“bstrVal”。对于阵列参数,它是“阵列”:
变异arr;
//...
arr.parray=安全阵列创建(VT_变体,2,sab);
如果我们需要调用一个具有多个参数的函数,比如:MyFun(x y),我们需要以相反的顺序传递它们:
VARIANT x;
x.vt = VT_I4;
x.lVal = 1;
VARIANT y;
x.vt = VT_I4;
x.lVal = 2;
AutoWrap(
DISPATCH_METHOD, NULL, pXlApp, L"MyFun", 2, y, x
);
至于一些随机方法所期望的参数,您需要查看特定调用的文档,或者如果不是文档化的接口,则需要查看类型库。并且认识到大多数COM对象实现了C++接口更容易的双接口(双接口允许IDISPoT后期绑定,以及常规的早期绑定,用于任何函数调用的所有类型检查)。
VARENUM类型的文档告诉您需要为任何给定的VT_uu值设置变量的哪个成员。&onMSDN@RomanR. 谢谢,你考虑过用进口吗?还是你被迫使用后期绑定?@xMRi我没有这方面的经验。另外,我听说,这可能会导致意外行为。