C语言 利用va_list 初始化DISPPARAMS参数封装方法
时间: 2023-08-13 17:08:21 浏览: 152
DISPPARAMS是在Windows平台中用于传递函数参数的一种结构体类型,它包含了参数数量、参数类型、参数值等信息。在C语言中,可以使用va_list类型来实现可变参数的传递,并将其封装成DISPPARAMS类型的参数。下面是一个示例代码:
```c
#include <Windows.h>
void CallMethod(IDispatch* pDispatch, DISPID dispid, DISPPARAMS* pParams, VARIANT* pVarResult)
{
HRESULT hr;
EXCEPINFO excepInfo;
// 初始化excepInfo结构体
memset(&excepInfo, 0, sizeof(EXCEPINFO));
excepInfo.wCode = 0;
excepInfo.wReserved = 0;
// 调用函数
hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, pParams, pVarResult, &excepInfo, NULL);
if (FAILED(hr)) {
// 处理错误
}
}
void InitParams(DISPPARAMS* pParams, UINT cArgs, ...)
{
va_list argList;
va_start(argList, cArgs);
// 设置参数数量
pParams->cArgs = cArgs;
// 分配存储参数值的空间
pParams->rgvarg = new VARIANT[cArgs];
// 设置参数类型和值
for (UINT i = 0; i < cArgs; i++) {
VARIANT* pArg = &(pParams->rgvarg[cArgs - i - 1]);
VariantInit(pArg);
pArg->vt = va_arg(argList, VARTYPE);
pArg->dblVal = va_arg(argList, double);
}
va_end(argList);
}
int main()
{
IDispatch* pDispatch;
DISPPARAMS params;
VARIANT varResult;
// 初始化params参数
InitParams(¶ms, 3, VT_I4, 1, VT_I4, 2, VT_I4, 3);
// 调用函数
CallMethod(pDispatch, dispid, ¶ms, &varResult);
// 释放资源
delete[] params.rgvarg;
return 0;
}
```
在以上示例代码中,InitParams函数接收可变数量的参数,并将其设置为DISPPARAMS结构体对应的参数类型和值。CallMethod函数则将DISPPARAMS参数传递给IDispatch对象的Invoke方法,并通过VARIANT*类型的指针参数pVarResult返回调用结果。
阅读全文