我在反抗Microsoft关于OLE自动化的文章。据我所知,AutoWrap函数用于调用外部方法,获取/设置属性。
让我们尝试理解调用此函数的代码:
//Make it visible (i.e. app.visible = 1)
{
//parameter preparation
VARIANT x;
x.vt = VT_I4;// type of parameter
x.lVal = 1;// value
AutoWrap(
DISPATCH_PROPERTYPUT, // set property
NULL, // we need no result
pXlApp,// pointer to Excel app
L"Visible",// "Visible" property
1,// 1 argument passed
x//passed argument
);
}我不明白的是x的结构:
x.vt = VT_I4是什么?它可能表示参数的类型。当它们将数组作为参数传递时,它们会这样写:VARIANT arr;
arr.vt = VT_ARRAY | VT_VARIANT;看上去有点像面具。
x.lVal = 1; --这意味着我们将整数1传递给可见函数。但是,对于每种类型的参数,必须使用哪些属性?我在文章中看到了"lVal“和"bstrVal”。对于数组参数,它是"parray":VARIANT arr;
//...
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);如果需要调用具有多个参数(例如: MyFun(x ))的函数,则需要按相反顺序传递它们:
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
);发布于 2018-05-17 06:32:44
就某些随机方法所期望的参数而言,您将需要查看特定调用的文档,或者类型库(如果不是文档化的接口)。并认识到大多数COM对象都实现了双接口,这对于C++来说要容易得多(双重接口既允许IDispatch后期绑定,也允许与所有可用的函数调用的类型检查进行规则的早期绑定)。
VARENUM类型的文档告诉您需要为任何给定的VT_值设置变量的哪个成员。
https://stackoverflow.com/questions/50384050
复制相似问题